Applied socket destruction bug patch

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32457 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2005-02-28 11:36:03 +00:00
parent f07067b7da
commit 84aa68c427

View File

@@ -83,6 +83,8 @@ extern HINSTANCE hInst;
#define assert(x)
#include <winsock.h>
#include "wx/msw/wince/net.h"
#include <wx/hashmap.h>
WX_DECLARE_HASH_MAP(int,bool,wxIntegerHash,wxIntegerEqual,SocketHash);
#endif
#include <string.h>
@@ -140,9 +142,7 @@ static int firstAvailable;
#ifndef __WXWINCE__
static WSAAsyncSelectFunc gs_WSAAsyncSelect = NULL;
#else
/* Setup WinCE specific stuff
*/
static socket_running;
static SocketHash socketHash;
static unsigned int currSocket;
HANDLE hThread[MAXSOCKETS];
static WSACreateEventFunc gs_WSACreateEvent = NULL;
@@ -175,7 +175,7 @@ DWORD WINAPI SocketThread(LPVOID data)
HANDLE NetworkEvent = gs_WSACreateEvent();
gs_WSAEventSelect(d->fd, NetworkEvent, d->lEvent);
while(socket_running)
while(socketHash[d->fd] == true)
{
if ((gs_WSAWaitForMultipleEvents(1, &NetworkEvent, FALSE,INFINITE, FALSE)) == WAIT_FAILED)
{
@@ -244,7 +244,7 @@ bool GSocketGUIFunctionsTableConcrete::OnInit()
if (!gs_wsock32dll)
return false;
gs_WSAAsyncSelect =(WSAAsyncSelectFunc)GetProcAddress(gs_wsock32dll,
"WSAAsyncSelect");
wxT("WSAAsyncSelect"));
if (!gs_WSAAsyncSelect)
return false;
#else
@@ -432,12 +432,13 @@ void GSocketGUIFunctionsTableConcrete::Enable_Events(GSocket *socket)
* WinCE creates a thread for socket event handling.
* All needed parameters get passed through the thread_data structure.
*/
socket_running = true;
thread_data* d = new thread_data;
d->lEvent = lEvent;
d->hEvtWin = hWin;
d->msgnumber = socket->m_msgnumber;
d->fd = socket->m_fd;
socketHash[socket->m_fd] = true;
hThread[currSocket++] = CreateThread(NULL, 0, &SocketThread,(LPVOID)d, 0, NULL);
#endif
}
@@ -456,8 +457,7 @@ void GSocketGUIFunctionsTableConcrete::Disable_Events(GSocket *socket)
gs_WSAAsyncSelect(socket->m_fd, hWin, socket->m_msgnumber, 0);
#else
//Destroy the thread
//TODO: This needs to be changed, maybe using another global event that could be triggered.
socket_running = false;
socketHash[socket->m_fd] = false;
#endif
}
}