From 7835583a720a42a0167ae7816f53458283bf3ccd Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Mon, 14 Jan 2019 03:19:50 +0100 Subject: [PATCH] Clean up dthread.cpp --- Source/dthread.cpp | 147 ++++++++++++++++++++++----------------------- Source/dthread.h | 6 +- 2 files changed, 76 insertions(+), 77 deletions(-) diff --git a/Source/dthread.cpp b/Source/dthread.cpp index d2c790683..7643c21f6 100644 --- a/Source/dthread.cpp +++ b/Source/dthread.cpp @@ -5,11 +5,11 @@ static CRITICAL_SECTION sgMemCrit; // idb unsigned int glpDThreadId; // idb TMegaPkt *sgpInfoHead; /* may not be right struct */ -char byte_52A508; // weak -HANDLE sghWorkToDoEvent; // idb +BOOLEAN dthread_running; +HANDLE sghWorkToDoEvent; /* rdata */ -static HANDLE sghThread = (HANDLE)0xFFFFFFFF; // idb +static HANDLE sghThread = INVALID_HANDLE_VALUE; #ifndef _MSC_VER __attribute__((constructor)) @@ -41,14 +41,12 @@ void __cdecl dthread_cleanup_mutex() void __fastcall dthread_remove_player(int pnum) { - int v1; // edi - TMegaPkt *i; // eax + TMegaPkt *pkt; - v1 = pnum; EnterCriticalSection(&sgMemCrit); - for (i = sgpInfoHead; i; i = i->pNext) { - if (i->dwSpaceLeft == v1) - i->dwSpaceLeft = 4; + for (pkt = sgpInfoHead; pkt; pkt = pkt->pNext) { + if (pkt->dwSpaceLeft == pnum) + pkt->dwSpaceLeft = 4; } LeaveCriticalSection(&sgMemCrit); } @@ -78,95 +76,96 @@ void __fastcall dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen) SetEvent(sghWorkToDoEvent); LeaveCriticalSection(&sgMemCrit); } -// 679660: using guessed type char gbMaxPlayers; void __cdecl dthread_start() { - char *v0; // eax - char *v1; // eax - - if (gbMaxPlayers != 1) { - sghWorkToDoEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if (!sghWorkToDoEvent) { - v0 = TraceLastError(); - TermMsg("dthread:1\n%s", v0); - } - byte_52A508 = 1; - sghThread = (HANDLE)_beginthreadex(NULL, 0, dthread_handler, NULL, 0, &glpDThreadId); - if (sghThread == (HANDLE)-1) { - v1 = TraceLastError(); - TermMsg("dthread2:\n%s", v1); - } + char *error_buf; + + if (gbMaxPlayers == 1) { + return; + } + + sghWorkToDoEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!sghWorkToDoEvent) { + error_buf = TraceLastError(); + TermMsg("dthread:1\n%s", error_buf); + } + + dthread_running = TRUE; + + sghThread = (HANDLE)_beginthreadex(NULL, 0, dthread_handler, NULL, 0, &glpDThreadId); + if (sghThread == INVALID_HANDLE_VALUE) { + error_buf = TraceLastError(); + TermMsg("dthread2:\n%s", error_buf); } } -// 52A508: using guessed type char byte_52A508; -// 679660: using guessed type char gbMaxPlayers; -unsigned int __stdcall dthread_handler(void *a1) +unsigned int __stdcall dthread_handler(void *unused) { - char *v1; // eax - TMegaPkt *v2; // esi - int v3; // ecx - unsigned int v4; // edi + char *error_buf; + TMegaPkt *pkt; + DWORD dwMilliseconds; - while (byte_52A508) { + while (dthread_running) { if (!sgpInfoHead && WaitForSingleObject(sghWorkToDoEvent, 0xFFFFFFFF) == -1) { - v1 = TraceLastError(); - TermMsg("dthread4:\n%s", v1); + error_buf = TraceLastError(); + TermMsg("dthread4:\n%s", error_buf); } + EnterCriticalSection(&sgMemCrit); - v2 = sgpInfoHead; + pkt = sgpInfoHead; if (sgpInfoHead) sgpInfoHead = sgpInfoHead->pNext; else ResetEvent(sghWorkToDoEvent); LeaveCriticalSection(&sgMemCrit); - if (v2) { - v3 = v2->dwSpaceLeft; - if (v3 != 4) - multi_send_zero_packet(v3, v2->data[0], &v2->data[8], *(_DWORD *)&v2->data[4]); - v4 = 1000 * *(_DWORD *)&v2->data[4] / (unsigned int)gdwDeltaBytesSec; - if (v4 >= 1) - v4 = 1; - mem_free_dbg(v2); - if (v4) - Sleep(v4); + + if (pkt) { + if (pkt->dwSpaceLeft != 4) + multi_send_zero_packet(pkt->dwSpaceLeft, pkt->data[0], &pkt->data[8], *(_DWORD *)&pkt->data[4]); + + dwMilliseconds = 1000 * *(_DWORD *)&pkt->data[4] / gdwDeltaBytesSec; + if (dwMilliseconds >= 1) + dwMilliseconds = 1; + + mem_free_dbg(pkt); + + if (dwMilliseconds) + Sleep(dwMilliseconds); } } + return 0; } -// 52A508: using guessed type char byte_52A508; // 679730: using guessed type int gdwDeltaBytesSec; void __cdecl dthread_cleanup() { - char *v0; // eax - TMegaPkt *v1; // eax - TMegaPkt *v2; // esi - - if (sghWorkToDoEvent) { - byte_52A508 = 0; - SetEvent(sghWorkToDoEvent); - if (sghThread != (HANDLE)-1 && glpDThreadId != GetCurrentThreadId()) { - if (WaitForSingleObject(sghThread, 0xFFFFFFFF) == -1) { - v0 = TraceLastError(); - TermMsg("dthread3:\n(%s)", v0); - } - CloseHandle(sghThread); - sghThread = (HANDLE)-1; - } - CloseHandle(sghWorkToDoEvent); - v1 = sgpInfoHead; - sghWorkToDoEvent = 0; - if (sgpInfoHead) { - do { - v2 = v1->pNext; - sgpInfoHead = 0; - mem_free_dbg(v1); - v1 = v2; - sgpInfoHead = v2; - } while (v2); + char *error_buf; + TMegaPkt *tmp1, *tmp2; + + if (sghWorkToDoEvent == NULL) { + return; + } + + dthread_running = FALSE; + SetEvent(sghWorkToDoEvent); + if (sghThread != INVALID_HANDLE_VALUE && glpDThreadId != GetCurrentThreadId()) { + if (WaitForSingleObject(sghThread, 0xFFFFFFFF) == -1) { + error_buf = TraceLastError(); + TermMsg("dthread3:\n(%s)", error_buf); } + CloseHandle(sghThread); + sghThread = INVALID_HANDLE_VALUE; + } + CloseHandle(sghWorkToDoEvent); + sghWorkToDoEvent = NULL; + + while (sgpInfoHead) { + tmp1 = sgpInfoHead->pNext; + tmp2 = sgpInfoHead; + sgpInfoHead = NULL; + mem_free_dbg(tmp2); + sgpInfoHead = tmp1; } } -// 52A508: using guessed type char byte_52A508; diff --git a/Source/dthread.h b/Source/dthread.h index 8eca249d2..a2b89967f 100644 --- a/Source/dthread.h +++ b/Source/dthread.h @@ -4,8 +4,8 @@ extern unsigned int glpDThreadId; // idb extern TMegaPkt *sgpInfoHead; /* may not be right struct */ -extern char byte_52A508; // weak -extern HANDLE sghWorkToDoEvent; // idb +extern BOOLEAN dthread_running; +extern HANDLE sghWorkToDoEvent; void __cdecl dthread_init_mutex(); void __cdecl dthread_cleanup_mutex_atexit(); @@ -13,7 +13,7 @@ void __cdecl dthread_cleanup_mutex(void); void __fastcall dthread_remove_player(int pnum); void __fastcall dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen); void __cdecl dthread_start(); -unsigned int __stdcall dthread_handler(void *a1); +unsigned int __stdcall dthread_handler(void *unused); void __cdecl dthread_cleanup(); /* data */