mirror of
https://github.com/solemnwarning/ipxwrapper
synced 2024-12-30 16:45:37 +01:00
Some bugfixes in the DirectPlay service provider code.
This commit is contained in:
parent
616859cc13
commit
ee30a6200f
@ -128,11 +128,15 @@ static DWORD WINAPI worker_main(LPVOID sp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!recv_packet(sp_data->sock, buf, sp)) {
|
if(!recv_packet(sp_data->sock, buf, sp)) {
|
||||||
|
release_sp_data((IDirectPlaySP*)sp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sp_data->ns_sock != -1 && recv_packet(sp_data->ns_sock, buf, sp)) {
|
if(sp_data->ns_sock != -1 && !recv_packet(sp_data->ns_sock, buf, sp)) {
|
||||||
return 1;
|
log_printf("Closing ns_sock due to error");
|
||||||
|
|
||||||
|
closesocket(sp_data->ns_sock);
|
||||||
|
sp_data->ns_sock = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
release_sp_data((IDirectPlaySP*)sp);
|
release_sp_data((IDirectPlaySP*)sp);
|
||||||
@ -354,7 +358,7 @@ static HRESULT WINAPI IPX_Open(LPDPSP_OPENDATA data) {
|
|||||||
|
|
||||||
memcpy(&addr, &(sp_data->addr), sizeof(addr));
|
memcpy(&addr, &(sp_data->addr), sizeof(addr));
|
||||||
addr.sa_socket = htons(DISCOVERY_SOCKET);
|
addr.sa_socket = htons(DISCOVERY_SOCKET);
|
||||||
|
|
||||||
if(bind(sp_data->ns_sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
if(bind(sp_data->ns_sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
||||||
closesocket(sp_data->ns_sock);
|
closesocket(sp_data->ns_sock);
|
||||||
sp_data->ns_sock = -1;
|
sp_data->ns_sock = -1;
|
||||||
@ -365,7 +369,7 @@ static HRESULT WINAPI IPX_Open(LPDPSP_OPENDATA data) {
|
|||||||
return DPERR_CANNOTCREATESERVER;
|
return DPERR_CANNOTCREATESERVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(WSAEventSelect(sp_data->sock, sp_data->event, FD_READ) == -1) {
|
if(WSAEventSelect(sp_data->ns_sock, sp_data->event, FD_READ) == -1) {
|
||||||
closesocket(sp_data->ns_sock);
|
closesocket(sp_data->ns_sock);
|
||||||
sp_data->ns_sock = -1;
|
sp_data->ns_sock = -1;
|
||||||
|
|
||||||
@ -403,11 +407,12 @@ static HRESULT WINAPI IPX_ShutdownEx(LPDPSP_SHUTDOWNDATA data) {
|
|||||||
|
|
||||||
struct sp_data *sp_data = get_sp_data(data->lpISP);
|
struct sp_data *sp_data = get_sp_data(data->lpISP);
|
||||||
|
|
||||||
|
sp_data->running = FALSE;
|
||||||
|
WSASetEvent(sp_data->event);
|
||||||
|
|
||||||
|
release_sp_data(data->lpISP);
|
||||||
|
|
||||||
if(sp_data->worker_thread) {
|
if(sp_data->worker_thread) {
|
||||||
sp_data->running = FALSE;
|
|
||||||
|
|
||||||
release_sp_data(data->lpISP);
|
|
||||||
|
|
||||||
if(WaitForSingleObject(sp_data->worker_thread, 3000) == WAIT_TIMEOUT) {
|
if(WaitForSingleObject(sp_data->worker_thread, 3000) == WAIT_TIMEOUT) {
|
||||||
log_printf("DirectPlay worker didn't exit in 3 seconds, killing");
|
log_printf("DirectPlay worker didn't exit in 3 seconds, killing");
|
||||||
TerminateThread(sp_data->worker_thread, 0);
|
TerminateThread(sp_data->worker_thread, 0);
|
||||||
|
@ -19,3 +19,4 @@ EXPORTS
|
|||||||
WSACloseEvent
|
WSACloseEvent
|
||||||
WSAEventSelect
|
WSAEventSelect
|
||||||
WSAResetEvent
|
WSAResetEvent
|
||||||
|
WSASetEvent
|
||||||
|
@ -16,6 +16,7 @@ WSACreateEvent
|
|||||||
WSAEventSelect
|
WSAEventSelect
|
||||||
WSACloseEvent
|
WSACloseEvent
|
||||||
WSAResetEvent
|
WSAResetEvent
|
||||||
|
WSASetEvent
|
||||||
r_EnumProtocolsA
|
r_EnumProtocolsA
|
||||||
r_EnumProtocolsW
|
r_EnumProtocolsW
|
||||||
r_WSARecvEx
|
r_WSARecvEx
|
||||||
|
@ -716,7 +716,7 @@ void rclient_stop(struct rclient *rclient) {
|
|||||||
EnterCriticalSection(&(rclient->router->crit_sec));
|
EnterCriticalSection(&(rclient->router->crit_sec));
|
||||||
|
|
||||||
rclient->router->running = FALSE;
|
rclient->router->running = FALSE;
|
||||||
SetEvent(rclient->router->wsa_event);
|
WSASetEvent(rclient->router->wsa_event);
|
||||||
|
|
||||||
LeaveCriticalSection(&(rclient->router->crit_sec));
|
LeaveCriticalSection(&(rclient->router->crit_sec));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user