1
0
Fork 0
devilution/Source/dthread.cpp

222 lines
5.5 KiB
C++

/*
* UNPUBLISHED -- Rights reserved under the copyright laws of the
* United States. Use of a copyright notice is precautionary only and
* does not imply publication or disclosure.
*
* THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION
* OF BLIZZARD ENTERTAINMENT. ANY DUPLICATION, MODIFICATION,
* DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR
* EXPRESS WRITTEN PERMISSION OF BLIZZARD ENTERTAINMENT.
*/
#include "../types.h"
int dthread_cpp_init_value; // weak
static CRITICAL_SECTION sgMemCrit; // idb
unsigned int glpDThreadId; // idb
TMegaPkt *sgpInfoHead; /* may not be right struct */
char byte_52A508; // weak
HANDLE sghWorkToDoEvent; // idb
int dthread_inf = 0x7F800000; // weak
/* rdata */
static HANDLE sghThread = (HANDLE)0xFFFFFFFF; // idb
//----- (0041509D) --------------------------------------------------------
struct dthread_cpp_init_1
{
dthread_cpp_init_1()
{
dthread_cpp_init_value = dthread_inf;
}
} _dthread_cpp_init_1;
// 47A460: using guessed type int dthread_inf;
// 52A4E0: using guessed type int dthread_cpp_init_value;
//----- (004150A8) --------------------------------------------------------
struct dthread_cpp_init_2
{
dthread_cpp_init_2()
{
dthread_init_mutex();
dthread_cleanup_mutex_atexit();
}
} _dthread_cpp_init_2;
//----- (004150B2) --------------------------------------------------------
void __cdecl dthread_init_mutex()
{
InitializeCriticalSection(&sgMemCrit);
}
//----- (004150BE) --------------------------------------------------------
void __cdecl dthread_cleanup_mutex_atexit()
{
atexit(dthread_cleanup_mutex);
}
//----- (004150CA) --------------------------------------------------------
void __cdecl dthread_cleanup_mutex()
{
DeleteCriticalSection(&sgMemCrit);
}
//----- (004150D6) --------------------------------------------------------
void __fastcall dthread_remove_player(int pnum)
{
int v1; // edi
TMegaPkt *i; // eax
v1 = pnum;
EnterCriticalSection(&sgMemCrit);
for ( i = sgpInfoHead; i; i = i->pNext )
{
if ( i->dwSpaceLeft == v1 )
i->dwSpaceLeft = 4;
}
LeaveCriticalSection(&sgMemCrit);
}
//----- (00415109) --------------------------------------------------------
void __fastcall dthread_send_delta(int pnum, int cmd, void *pbSrc, int dwLen)
{
char v4; // bl
TMegaPkt *v5; // eax
TMegaPkt *v6; // esi
TMegaPkt *v7; // eax
TMegaPkt **v8; // ecx
int v9; // [esp+4h] [ebp-4h]
v4 = cmd;
v9 = pnum;
if ( gbMaxPlayers != 1 )
{
v5 = (TMegaPkt *)DiabloAllocPtr(dwLen + 20);
v6 = v5;
v5->pNext = 0;
v5->dwSpaceLeft = v9;
v5->data[0] = v4;
*(_DWORD *)&v5->data[4] = dwLen;
memcpy(&v5->data[8], pbSrc, dwLen);
EnterCriticalSection(&sgMemCrit);
v7 = sgpInfoHead;
v8 = &sgpInfoHead;
while ( v7 )
{
v8 = &v7->pNext;
v7 = v7->pNext;
}
*v8 = v6;
SetEvent(sghWorkToDoEvent);
LeaveCriticalSection(&sgMemCrit);
}
}
// 679660: using guessed type char gbMaxPlayers;
//----- (00415186) --------------------------------------------------------
void __cdecl dthread_start()
{
char *v0; // eax
char *v1; // eax
if ( gbMaxPlayers != 1 )
{
sghWorkToDoEvent = CreateEventA(NULL, TRUE, FALSE, NULL);
if ( !sghWorkToDoEvent )
{
v0 = GetLastErr();
TermMsg("dthread:1\n%s", v0);
}
byte_52A508 = 1;
sghThread = (HANDLE)_beginthreadex(NULL, 0, dthread_handler, NULL, 0, &glpDThreadId);
if ( sghThread == (HANDLE)-1 )
{
v1 = GetLastErr();
TermMsg("dthread2:\n%s", v1);
}
}
}
// 52A508: using guessed type char byte_52A508;
// 679660: using guessed type char gbMaxPlayers;
//----- (004151F3) --------------------------------------------------------
unsigned int __stdcall dthread_handler(void *a1)
{
char *v1; // eax
TMegaPkt *v2; // esi
int v3; // ecx
unsigned int v4; // edi
while ( byte_52A508 )
{
if ( !sgpInfoHead && WaitForSingleObject(sghWorkToDoEvent, 0xFFFFFFFF) == -1 )
{
v1 = GetLastErr();
TermMsg("dthread4:\n%s", v1);
}
EnterCriticalSection(&sgMemCrit);
v2 = 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);
}
}
return 0;
}
// 52A508: using guessed type char byte_52A508;
// 679730: using guessed type int gdwDeltaBytesSec;
//----- (004152C0) --------------------------------------------------------
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 = GetLastErr();
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 );
}
}
}
// 52A508: using guessed type char byte_52A508;