From 49a9d13abb42a0f9fbeafaa283a87b93045f1acf Mon Sep 17 00:00:00 2001 From: Xadhoom <> Date: Sun, 27 Jan 2019 15:02:34 +0000 Subject: [PATCH] extend threads emulation for multiplayer; fix net stub --- Stub/miniwin_sdl.h | 1 + Stub/miniwin_thread.cpp | 30 +++++++++++++++++++++++++++--- Stub/storm_net.cpp | 12 +++++++++--- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/Stub/miniwin_sdl.h b/Stub/miniwin_sdl.h index 48662b64b..dcce4aaf2 100644 --- a/Stub/miniwin_sdl.h +++ b/Stub/miniwin_sdl.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include diff --git a/Stub/miniwin_thread.cpp b/Stub/miniwin_thread.cpp index 11a22a3a7..b3ae82161 100644 --- a/Stub/miniwin_thread.cpp +++ b/Stub/miniwin_thread.cpp @@ -1,5 +1,8 @@ #include "../types.h" +static std::set threads; +static std::set events; + struct event_emul { SDL_mutex *mutex; SDL_cond *cond; @@ -15,8 +18,9 @@ uintptr_t __cdecl _beginthreadex(void *_Security, unsigned _StackSize, unsigned( if(_InitFlag != 0) UNIMPLEMENTED(); // WARNING: wrong return type of _StartAddress - SDL_Thread *ret = SDL_CreateThread((SDL_ThreadFunction)_StartAddress, "", _ArgList); + SDL_Thread *ret = SDL_CreateThread((SDL_ThreadFunction)_StartAddress, NULL, _ArgList); *_ThrdAddr = SDL_GetThreadID(ret); + threads.insert((HANDLE)ret); return (uintptr_t)ret; } @@ -81,6 +85,7 @@ HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, WINBOOL bMan ret = (struct event_emul*)malloc(sizeof(struct event_emul)); ret->mutex = SDL_CreateMutex(); ret->cond = SDL_CreateCond(); + events.insert((HANDLE*)ret); return ret; } @@ -102,7 +107,7 @@ BOOL WINAPI ResetEvent(HANDLE hEvent) return 1; } -DWORD WINAPI WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) +static DWORD wait_for_sdl_cond(HANDLE hHandle, DWORD dwMilliseconds) { struct event_emul *e = (struct event_emul*)hHandle; SDL_LockMutex(e->mutex); @@ -113,6 +118,25 @@ DWORD WINAPI WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) ret = SDL_CondWaitTimeout(e->cond, e->mutex, dwMilliseconds); SDL_CondSignal(e->cond); SDL_UnlockMutex(e->mutex); - return ret; // return value different from WinAPI + return ret; +} + +static DWORD wait_for_sdl_thread(HANDLE hHandle, DWORD dwMilliseconds) +{ + if(dwMilliseconds != INFINITE) + UNIMPLEMENTED(); + SDL_Thread *t = (SDL_Thread*)hHandle; + SDL_WaitThread(t, NULL); + return 0; +} + +DWORD WINAPI WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) +{ + // return value different from WinAPI + if(threads.find(hHandle) != threads.end()) + return wait_for_sdl_thread(hHandle, dwMilliseconds); + if(events.find(hHandle) != threads.end()) + return wait_for_sdl_cond(hHandle, dwMilliseconds); + UNIMPLEMENTED(); } diff --git a/Stub/storm_net.cpp b/Stub/storm_net.cpp index 728c8d0ed..04d1c41c8 100644 --- a/Stub/storm_net.cpp +++ b/Stub/storm_net.cpp @@ -153,8 +153,14 @@ BOOLEAN __stdcall SNetSetBasePlayer(int) int __stdcall SNetGetProviderCaps(struct _SNETCAPS *caps) { - memset(caps, 0, sizeof(struct _SNETCAPS)); - caps->maxplayers = 1; - caps->bytessec = 100000; + caps->size = 0; // engine writes only ?!? + caps->flags = 0; // unused + caps->maxmessagesize = 512; // capped to 512; underflow if < 24 + caps->maxqueuesize = 0; // unused + caps->maxplayers = gbMaxPlayers; // capped to 4 + caps->bytessec = 100000; // ? + caps->latencyms = 0; // unused + caps->defaultturnssec = 10; // ? + caps->defaultturnsintransit = 10; // ? return 1; }