Changeset 6196 for trunk/src


Ignore:
Timestamp:
Jul 7, 2001, 12:44:11 PM (24 years ago)
Author:
achimha
Message:

implemented WSAEventSelect

Location:
trunk/src/wsock32
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wsock32/asyncapi.cpp

    r5625 r6196  
    1 /* $Id: asyncapi.cpp,v 1.9 2001-04-28 16:15:18 sandervl Exp $ */
     1/* $Id: asyncapi.cpp,v 1.10 2001-07-07 10:44:08 achimha Exp $ */
    22
    33/*
     
    156156
    157157   if(!pThreadParm->fCancelled) {
    158         dprintf(("WSAsyncThreadProc %x %x %x %x", pThreadParm->hwnd, pThreadParm->msg, pThreadParm->hAsyncTaskHandle, lParam));
    159         PostMessageA(pThreadParm->hwnd, pThreadParm->msg,
     158        dprintf(("WSAsyncThreadProc %x %x %x %x", pThreadParm->notifyHandle, pThreadParm->notifyData, pThreadParm->hAsyncTaskHandle, lParam));
     159        PostMessageA((HWND)pThreadParm->notifyHandle, (DWORD)pThreadParm->notifyData,
    160160                     (WPARAM)pThreadParm->hAsyncTaskHandle, lParam);
    161161   }
     
    203203        }
    204204        memset(pThreadParm, 0, sizeof(*pThreadParm));
    205         pThreadParm->request= requesttype;
    206         pThreadParm->hwnd   = hwnd;
    207         pThreadParm->msg    = msg;
    208         pThreadParm->buf    = buf;
    209         pThreadParm->buflen = buflen;
     205        pThreadParm->request      = requesttype;
     206        pThreadParm->notifyHandle = (int)hwnd;
     207        pThreadParm->notifyData   = (int)msg;
     208        pThreadParm->buf          = buf;
     209        pThreadParm->buflen       = buflen;
    210210
    211211        switch(requesttype) {
     
    399399//******************************************************************************
    400400//******************************************************************************
    401 void AsyncNotifyEvent(PASYNCTHREADPARM pThreadParm, ULONG event, ULONG socket_error)
    402 {
    403    pThreadParm->u.asyncselect.lEventsPending &= ~event;
    404 
    405    event = WSAMAKESELECTREPLY(event, socket_error);
    406 
    407    dprintf(("AsyncNotifyEvent %x %x %x %x", pThreadParm->u.asyncselect.s, pThreadParm->hwnd, pThreadParm->msg, event));
    408    PostMessageA(pThreadParm->hwnd, pThreadParm->msg, (WPARAM)pThreadParm->u.asyncselect.s,
    409                (LPARAM)event);
     401void AsyncSelectNotifyEvent(PASYNCTHREADPARM pThreadParm, ULONG event, ULONG socket_error)
     402{
     403    pThreadParm->u.asyncselect.lEventsPending &= ~event;
     404
     405    event = WSAMAKESELECTREPLY(event, socket_error);
     406
     407    if (pThreadParm->u.asyncselect.mode == WSA_SELECT_HWND)
     408    {
     409        dprintf(("AsyncSelectNotifyEvent: notifying window %x %x %x %x", pThreadParm->u.asyncselect.s, pThreadParm->notifyHandle, pThreadParm->notifyData, event));
     410        PostMessageA((HWND)pThreadParm->notifyHandle, (DWORD)pThreadParm->notifyData, (WPARAM)pThreadParm->u.asyncselect.s,
     411                     (LPARAM)event);
     412    }
     413    else
     414    if (pThreadParm->u.asyncselect.mode == WSA_SELECT_HEVENT)
     415    {
     416        dprintf(("AsyncSelectNotifyEvent: notifying event semaphore %x %x %x %x", pThreadParm->u.asyncselect.s, pThreadParm->notifyHandle, pThreadParm->notifyData, event));
     417        SetEvent(pThreadParm->notifyHandle);
     418    }
     419    else
     420    {
     421        dprintf(("AsyncSelectNotifyEvent: error, unknown mode"));
     422    }
    410423}
    411424//******************************************************************************
     
    483496                        if(lEventsPending & FD_CLOSE) {
    484497                                dprintf(("FD_CLOSE; broken connection"));
    485                                 AsyncNotifyEvent(pThreadParm, FD_CLOSE, WSAECONNRESET);
     498                                AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, WSAECONNRESET);
    486499                        }
    487500
     
    494507                        if(lEventsPending & FD_CLOSE) {
    495508                                dprintf(("FD_CLOSE; SOCEINVAL"));
    496                                 AsyncNotifyEvent(pThreadParm, FD_CLOSE, selecterr);
     509                                AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, selecterr);
    497510                        }
    498511                        break;
     
    510523                if(lEventsPending & FD_CONNECT) {
    511524                        if(state & SS_ISCONNECTED) {
    512                                 AsyncNotifyEvent(pThreadParm, FD_CONNECT, NO_ERROR);
     525                                AsyncSelectNotifyEvent(pThreadParm, FD_CONNECT, NO_ERROR);
    513526                        }
    514527                        else {
     
    519532                                //SvL: WSeB returns SOCECONNREFUSED, Warp 4 0x3d
    520533                                if(sockoptval == SOCECONNREFUSED || sockoptval == (SOCECONNREFUSED - SOCBASEERR)) {
    521                                         AsyncNotifyEvent(pThreadParm, FD_CONNECT, WSAECONNREFUSED);
     534                                        AsyncSelectNotifyEvent(pThreadParm, FD_CONNECT, WSAECONNREFUSED);
    522535                                }
    523536                        }
     
    525538                else
    526539                if(!(state & SS_CANTSENDMORE) && (lEventsPending & FD_WRITE)) {
    527                         AsyncNotifyEvent(pThreadParm, FD_WRITE, NO_ERROR);
     540                        AsyncSelectNotifyEvent(pThreadParm, FD_WRITE, NO_ERROR);
    528541                }
    529542        }
     
    537550                        {
    538551                                dprintf(("FD_CLOSE; ioctl; socket error"));
    539                                 AsyncNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
     552                                AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
    540553                                //remote connection broken (so can't receive data anymore)
    541554                                //but can still send
     
    559572                        }
    560573                        if((sockoptval & SO_ACCEPTCONN) == SO_ACCEPTCONN) {
    561                                 AsyncNotifyEvent(pThreadParm, FD_ACCEPT, NO_ERROR);
     574                                AsyncSelectNotifyEvent(pThreadParm, FD_ACCEPT, NO_ERROR);
    562575                        }
    563576                }
    564577                if((lEventsPending & FD_READ) && bytesread >= 0) {
    565                         AsyncNotifyEvent(pThreadParm, FD_READ, NO_ERROR);
     578                        AsyncSelectNotifyEvent(pThreadParm, FD_READ, NO_ERROR);
    566579                }
    567580#if 0
     
    571584                if((lEventsPending & FD_CLOSE) && (state == 0 && bytesread == 0)) {
    572585                        dprintf(("FD_CLOSE; state == 0 && bytesread == 0"));
    573                         AsyncNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
     586                        AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
    574587                }
    575588#endif
     
    578591        {
    579592                if(lEventsPending & FD_OOB) {
    580                         AsyncNotifyEvent(pThreadParm, FD_OOB, NO_ERROR);
     593                        AsyncSelectNotifyEvent(pThreadParm, FD_OOB, NO_ERROR);
    581594                }
    582595        }
     
    600613              long,lEvent)
    601614{
     615   /* just forward call to worker method */
     616   return WSAAsyncSelectWorker(s, WSA_SELECT_HWND, (int)hWnd, (int)wMsg, lEvent);
     617}
     618//******************************************************************************
     619//******************************************************************************
     620int WSAAsyncSelectWorker(SOCKET s, int mode, int notifyHandle, int notifyData, long lEventMask)
     621{
    602622  PASYNCTHREADPARM pThreadParm;
    603623  int              nonblock = 1;
    604624  int              ret;
    605625
     626#ifdef DEBUG
     627    // log all event bits that are set
     628    char tmpbuf[300];
     629    strcpy(tmpbuf, "");
     630    if (lEventMask & FD_READ)
     631        strcat(tmpbuf, " FD_READ");
     632    if (lEventMask & FD_WRITE)
     633        strcat(tmpbuf, " FD_WRITE");
     634    if (lEventMask & FD_OOB)
     635        strcat(tmpbuf, " FD_OOB");   
     636    if (lEventMask & FD_ACCEPT)
     637        strcat(tmpbuf, " FD_ACCEPT");
     638    if (lEventMask & FD_CONNECT)
     639        strcat(tmpbuf, " FD_CONNECT");
     640    if (lEventMask & FD_CLOSE)
     641        strcat(tmpbuf, " FD_CLOSE");
     642    if (lEventMask & FD_QOS)
     643        strcat(tmpbuf, " FD_QOS");
     644    if (lEventMask & FD_GROUP_QOS)
     645        strcat(tmpbuf, " FD_GROUP_QOS");
     646    if (lEventMask & FD_ROUTING_INTERFACE_CHANGE)
     647        strcat(tmpbuf, " FD_ROUTING_INTERFACE_CHANGE");
     648    if (lEventMask & FD_ADDRESS_LIST_CHANGE)
     649        strcat(tmpbuf, " FD_ADDRESS_LIST_CHANGE");
     650    dprintf(("event bits:%s", tmpbuf));
     651#endif
     652
    606653   if(!fWSAInitialized)
    607654   {
     655        dprintf(("WSA sockets not initialized"));
    608656        WSASetLastError(WSANOTINITIALISED);
    609657        return SOCKET_ERROR;
     
    612660   if(WSAIsBlocking())
    613661   {
     662        dprintf(("blocking call in progress"));
    614663        WSASetLastError(WSAEINPROGRESS);        // blocking call in progress
    615664        return SOCKET_ERROR;
    616665   }
    617666   else
    618    if(hWnd && !IsWindow(hWnd))
    619    {
     667   if((mode == WSA_SELECT_HWND) && (HWND)notifyHandle && !IsWindow((HWND)notifyHandle))
     668   {
     669        dprintf(("invalid window handle"));
    620670        WSASetLastError(WSAEINVAL);             // invalid parameter
    621671        return SOCKET_ERROR;
    622672   }
     673#if 0
     674// AH: null sempahore is ok when clearing request
     675   else
     676   if ((mode == WSA_SELECT_HEVENT) && !(WSAEVENT)notifyHandle)
     677   {
     678        dprintf(("invalid event semaphore handle"));
     679        WSASetLastError(WSAEINVAL);             // invalid parameter
     680        return SOCKET_ERROR;
     681   }
     682#endif
     683
    623684   //Set socket to non-blocking mode
    624685   ret = ioctl(s, FIONBIO, (char *) &nonblock, sizeof(nonblock));
    625686   if(ret == SOCKET_ERROR) {
     687        dprintf(("setting socket to non blocking mode failed"));
    626688        WSASetLastError(wsaErrno());
    627689        return SOCKET_ERROR;
    628690   }
    629    if(FindAndSetAsyncEvent(s, hWnd, wMsg, lEvent) == TRUE) {
     691   if(FindAndSetAsyncEvent(s, mode, notifyHandle, notifyData, lEventMask) == TRUE)
     692   {
     693        dprintf(("already got socket, just changing event mask"));
    630694        //found and changed active async event
    631695        WSASetLastError(NO_ERROR);
     
    640704   }
    641705   memset(pThreadParm, 0, sizeof(*pThreadParm));
    642    pThreadParm->request= ASYNC_SELECT;
    643    pThreadParm->hwnd   = hWnd;
    644    pThreadParm->msg    = wMsg;
    645    pThreadParm->u.asyncselect.lEvents        = lEvent;
    646    pThreadParm->u.asyncselect.lEventsPending = lEvent;
     706   pThreadParm->request                      = ASYNC_SELECT;
     707   pThreadParm->notifyHandle                 = notifyHandle;
     708   pThreadParm->notifyData                   = notifyData;
     709   pThreadParm->u.asyncselect.mode           = mode;
     710   pThreadParm->u.asyncselect.lEvents        = lEventMask;
     711   pThreadParm->u.asyncselect.lEventsPending = lEventMask;
    647712   pThreadParm->u.asyncselect.s              = s;
    648713   pThreadParm->u.asyncselect.asyncSem       = new VSemaphore;
  • trunk/src/wsock32/asyncthread.cpp

    r5638 r6196  
    1 /* $Id: asyncthread.cpp,v 1.9 2001-04-29 18:47:31 sandervl Exp $ */
     1/* $Id: asyncthread.cpp,v 1.10 2001-07-07 10:44:09 achimha Exp $ */
    22
    33/*
     
    208208//******************************************************************************
    209209//******************************************************************************
    210 BOOL FindAndSetAsyncEvent(SOCKET s, HWND hwnd, int msg, ULONG lEvent)
     210BOOL FindAndSetAsyncEvent(SOCKET s, int mode, int notifyHandle, int notifyData, ULONG lEventMask)
    211211{
    212212 PASYNCTHREADPARM pThreadInfo;
     
    215215   pThreadInfo = FindAsyncEvent(s);
    216216   if(pThreadInfo) {
    217         pThreadInfo->u.asyncselect.lEvents        = lEvent;
    218         pThreadInfo->u.asyncselect.lEventsPending = lEvent;
    219         pThreadInfo->hwnd                  = hwnd;
    220         pThreadInfo->msg                   = msg;
    221         if(lEvent == 0) {
     217        pThreadInfo->u.asyncselect.mode           = mode;
     218        pThreadInfo->u.asyncselect.lEvents        = lEventMask;
     219        pThreadInfo->u.asyncselect.lEventsPending = lEventMask;
     220        pThreadInfo->notifyHandle                 = notifyHandle;
     221        pThreadInfo->notifyData                   = notifyData;
     222        if(lEventMask == 0) {
    222223                //make sure this thread isn't used anymore
    223224                pThreadInfo->fRemoved = TRUE;
     
    263264   pThreadInfo = FindAsyncEvent(s);
    264265   if(pThreadInfo) {
    265         *pHwnd   = pThreadInfo->hwnd;
    266         *pMsg    = pThreadInfo->msg;
     266        *pHwnd   = (HWND)pThreadInfo->notifyHandle;
     267        *pMsg    = pThreadInfo->notifyData;
    267268        *plEvent = pThreadInfo->u.asyncselect.lEvents;
    268269   }
  • trunk/src/wsock32/asyncthread.h

    r3557 r6196  
    1 /* $Id: asyncthread.h,v 1.5 2000-05-18 22:54:21 sandervl Exp $ */
     1/* $Id: asyncthread.h,v 1.6 2001-07-07 10:44:09 achimha Exp $ */
    22
    33/*
     
    4040        ASYNCTHREADPROC asyncProc;
    4141        VMutex         *parmmutex;
    42         HWND            hwnd;
    43         DWORD           msg;
     42        int             notifyHandle;
     43        int             notifyData;
    4444        LPSTR           buf;
    4545        DWORD           buflen;
     
    7272                        DWORD       lEventsPending;
    7373                        SOCKET      s;
     74                        int         mode;
    7475                } asyncselect;
    7576        } u;
     
    8283void  EnableAsyncEvent(SOCKET s, ULONG flags);
    8384BOOL  QueryAsyncEvent(SOCKET s, HWND *pHwnd, int *pMsg, ULONG *plEvent);
    84 BOOL  FindAndSetAsyncEvent(SOCKET s, HWND hwnd, int msg, ULONG lEvent);
     85BOOL FindAndSetAsyncEvent(SOCKET s, int mode, int notifyHandle, int notifyData, ULONG lEventMask);
    8586
    8687#endif  //__ASYNCTHREAD_H__
  • trunk/src/wsock32/makefile

    r4717 r6196  
    1 # $Id: makefile,v 1.29 2000-12-02 23:43:27 bird Exp $
     1# $Id: makefile,v 1.30 2001-07-07 10:44:09 achimha Exp $
    22
    33#
     
    3232$(OBJDIR)\asyncapi.obj \
    3333$(OBJDIR)\asyncthread.obj \
    34 $(OBJDIR)\dbglocal.obj
     34$(OBJDIR)\dbglocal.obj \
     35$(OBJDIR)\wsock2.obj
    3536
    3637
  • trunk/src/wsock32/wsock32.cpp

    r5625 r6196  
    1 /* $Id: wsock32.cpp,v 1.35 2001-04-28 16:15:18 sandervl Exp $ */
     1/* $Id: wsock32.cpp,v 1.36 2001-07-07 10:44:10 achimha Exp $ */
    22
    33/*
     
    154154  // to SetLastError()
    155155  if(iError) {
    156         dprintf(("WSASetLastError %x", iError));
     156        dprintf(("WSASetLastError 0x%x", iError));
    157157  }
    158158  SetLastError(iError);
     
    236236   }
    237237   //Close WSAAsyncSelect thread if one was created for this socket
    238    FindAndSetAsyncEvent(s, 0, 0, 0);
     238   FindAndSetAsyncEvent(s, WSA_SELECT_HWND, 0, 0, 0);
    239239
    240240   // wait thread termination
     
    863863
    864864   if(!fWSAInitialized) {
    865         WSASetLastError(WSANOTINITIALISED);
    866         return SOCKET_ERROR;
    867    }
    868    else
    869    if(WSAIsBlocking()) {
     865        dprintf(("WSA not initialized"));
     866        WSASetLastError(WSANOTINITIALISED);
     867        return SOCKET_ERROR;
     868   }
     869   else
     870   if(WSAIsBlocking()) {
     871        dprintf(("WSA is blocking"));
    870872        WSASetLastError(WSAEINPROGRESS);
    871873        return SOCKET_ERROR;
     
    887889        case SO_LINGER:
    888890                if(optlen < (int)sizeof(ws_linger)) {
     891                        dprintf(("SOL_SOCKET, SO_LINGER, optlen too small"));
    889892                        WSASetLastError(WSAEFAULT);
    890893                        return SOCKET_ERROR;
     
    899902        case SO_RCVBUF:
    900903                if(optlen < (int)sizeof(int)) {
     904                        dprintf(("SOL_SOCKET, SO_RCVBUF, optlen too small"));
    901905                        WSASetLastError(WSAEFAULT);
    902906                        return SOCKET_ERROR;
     
    923927        case SO_REUSEADDR:
    924928                if(optlen < (int)sizeof(int)) {
     929                        dprintf(("SOL_SOCKET, SO_REUSEADDR, optlen too small"));
    925930                        WSASetLastError(WSAEFAULT);
    926931                        return SOCKET_ERROR;
     
    938943        if(optname == TCP_NODELAY) {
    939944                if(optlen < (int)sizeof(int)) {
     945                        dprintf(("IPPROTO_TCP, TCP_NODELAY, optlen too small"));
    940946                        WSASetLastError(WSAEFAULT);
    941947                        return SOCKET_ERROR;
     
    950956   }
    951957   else {
     958        dprintf(("unknown level code!"));
    952959        WSASetLastError(WSAEINVAL);
    953960        return SOCKET_ERROR;
  • trunk/src/wsock32/wsock32.def

    r4809 r6196  
    1 ; $Id: wsock32.def,v 1.21 2000-12-16 22:53:51 bird Exp $
     1; $Id: wsock32.def,v 1.22 2001-07-07 10:44:11 achimha Exp $
    22
    33;Created by BLAST for IBM's compiler
     
    112112
    113113                                 _OS2gethostname@8                        @2000
     114
     115; functions for ws2_32 implemented here
     116   WSAEventSelect              = _WSAEventSelect@12                       @3001
  • trunk/src/wsock32/wsock32.h

    r5279 r6196  
    1 /* $Id: wsock32.h,v 1.16 2001-02-28 20:28:09 sandervl Exp $ */
     1/* $Id: wsock32.h,v 1.17 2001-07-07 10:44:11 achimha Exp $ */
    22
    33/* WSOCK32.H--definitions & conversions for Odin's wsock32.dll.
     
    5151
    5252// WSAAsyncSelect flags
    53 #define FD_READ         0x01
    54 #define FD_WRITE        0x02
    55 #define FD_OOB          0x04
    56 #define FD_ACCEPT       0x08
    57 #define FD_CONNECT      0x10
    58 #define FD_CLOSE        0x20
     53// also apply to Winsock 2.0 WSAEventSelect
     54#define FD_READ                     0x01
     55#define FD_WRITE                    0x02
     56#define FD_OOB                      0x04
     57#define FD_ACCEPT                   0x08
     58#define FD_CONNECT                  0x10
     59#define FD_CLOSE                    0x20
     60// Winsock 2.0 only
     61#define FD_QOS                      0x40
     62#define FD_GROUP_QOS                0x80
     63#define FD_ROUTING_INTERFACE_CHANGE 0x100
     64#define FD_ADDRESS_LIST_CHANGE      0x200
    5965
    6066#define SOCKET_ERROR            -1
     
    235241LPWSINFO WINSOCK_GetIData(HANDLE tid = CURRENT_THREAD);
    236242
     243typedef HANDLE WSAEVENT;
     244
     245// modes for the async select worker
     246#define WSA_SELECT_HWND   1
     247#define WSA_SELECT_HEVENT 2
     248// async select worker routine
     249int WSAAsyncSelectWorker(SOCKET s, int mode, int notifyHandle, int notifyData, long lEventMask);
     250
    237251#endif  /* _WINSOCK32CONST_ */
    238252
  • trunk/src/wsock32/wsock32rsrc.orc

    r4952 r6196  
    1 /* $Id: wsock32rsrc.orc,v 1.3 2001-01-14 21:00:06 sandervl Exp $ */
     1/* $Id: wsock32rsrc.orc,v 1.4 2001-07-07 10:44:11 achimha Exp $ */
    22
    33#include "winuser.h"
     
    2828            VALUE "FileVersion", "4.00\0"
    2929            VALUE "InternalName", "WSOCK32\0"
    30             VALUE "LegalCopyright", "Copyright (C) 1999-2000\0"
     30            VALUE "LegalCopyright", "Copyright (C) 1999-2001\0"
    3131            VALUE "LegalTrademarks", "\0"
    3232            VALUE "OriginalFilename", "WSOCK32.DLL\0"
Note: See TracChangeset for help on using the changeset viewer.