CParallelProcessor<CGameClient*,CFuncJobItemProcessor<CGameClient*>,1>::Run
0x00200b50 · 2005 bytes · __thiscall
_ZN18CParallelProcessorIP11CGameClient21CFuncJobItemProcessorIS1_ELi1EE3RunEPS1_jiP11IThreadPool
Decompiled
undefined (5 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CParallelProcessor<CGameClient*, CFuncJobItemProcessor<CGameClient*>, 1>::Run(CGameClient**,
unsigned int, int, IThreadPool*) */
void __thiscall
CParallelProcessor<CGameClient*,CFuncJobItemProcessor<CGameClient*>,1>::Run
(CParallelProcessor<CGameClient*,CFuncJobItemProcessor<CGameClient*>,1> *this,
CGameClient **param_1,uint param_2,int param_3,IThreadPool *param_4)
{
uint uVar1;
CGameClient *pCVar2;
code *pcVar3;
int iVar4;
int *piVar5;
int iVar6;
CParallelProcessor<CGameClient*,CFuncJobItemProcessor<CGameClient*>,1> *pCVar7;
undefined4 uVar8;
undefined4 *****pppppuVar9;
undefined4 *puVar10;
undefined4 uVar11;
int iVar12;
int iVar13;
uint uVar14;
IThreadPool *pIVar15;
IThreadPool *pIVar16;
IThreadPool **ppIVar17;
int in_GS_OFFSET;
undefined4 uStack_e0;
IThreadPool *local_dc;
undefined4 *****local_d8;
uint local_d4 [4];
char *local_c4 [5];
uint local_b0 [4];
undefined1 auStack_a0 [4];
CParallelProcessor<CGameClient*,CFuncJobItemProcessor<CGameClient*>,1> *local_9c;
int local_98;
CGameClient *local_94;
undefined1 *local_90;
int *local_88;
undefined4 *****local_84;
uint local_80;
undefined4 *****local_7c;
uint local_78;
undefined4 *****local_74;
uint local_70;
undefined4 local_6c;
undefined4 local_68;
undefined4 *****local_64;
uint local_60;
undefined4 *****local_5c;
uint local_58;
IThreadPool *local_54;
undefined4 *****local_50;
uint local_4c;
IThreadPool *local_48;
undefined4 *****local_44;
uint local_40;
IThreadPool *local_3c;
undefined4 local_38;
undefined4 local_34;
IThreadPool *local_30;
undefined4 *****local_2c;
uint local_28;
IThreadPool *local_24;
int local_20;
local_84 = (undefined4 ******)0x0;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_80 = 0;
if (_g_Telemetry == (IThreadPool *)0x0) {
local_54 = (IThreadPool *)0x0;
}
else {
local_b0[0] = param_2;
local_c4[4] = *(char **)(this + 0x14);
local_dc = _g_Telemetry;
local_c4[3] = "Run %s %d";
local_c4[2] = (char *)&Run(CGameClient**,unsigned_int,int,IThreadPool*)::tm_fmt;
local_c4[1] = (char *)0x367;
local_d8 = &local_84;
local_c4[0] = "/data/src/public/vstdlib/jobthread.h";
local_d4[3] = 0;
local_d4[1] = 0;
local_d4[2] = 0;
local_d4[0] = 0;
uStack_e0 = 0x200be6;
(*(code *)*(CGameClient **)(_g_Telemetry + 0x50))();
local_54 = _g_Telemetry;
}
pIVar15 = _g_pThreadPool;
local_5c = local_84;
local_58 = local_80;
if (param_2 == 0) {
LAB_002012cf:
ppIVar17 = &local_dc;
if (local_54 != (IThreadPool *)0x0) {
local_d4[3] = 0;
local_d4[2] = 0;
local_d4[1] = 0;
local_d8 = local_5c;
local_d4[0] = local_58;
uStack_e0 = 0x201303;
local_dc = local_54;
(*(code *)*(CGameClient **)(local_54 + 0x54))();
ppIVar17 = &local_dc;
}
}
else {
if (param_4 == (IThreadPool *)0x0) {
local_9c = this + 0xc;
LOCK();
*(CGameClient ***)local_9c = param_1;
UNLOCK();
pIVar16 = (IThreadPool *)(param_1 + param_2);
*(IThreadPool **)(this + 0x10) = pIVar16;
if (pIVar15 == (IThreadPool *)0x0) {
local_7c = (undefined4 ******)0x0;
local_78 = 0;
if (_g_Telemetry == (IThreadPool *)0x0) {
local_48 = (IThreadPool *)0x0;
}
else {
local_c4[4] = *(char **)(this + 0x14);
local_c4[3] = "DoExecute %s";
local_c4[2] = (char *)&DoExecute()::tm_fmt;
local_c4[1] = (char *)0x3a9;
local_c4[0] = "/data/src/public/vstdlib/jobthread.h";
local_d8 = &local_7c;
local_d4[3] = 0;
local_d4[1] = 0;
local_d4[2] = 0;
local_d4[0] = 0;
local_dc = _g_Telemetry;
/* try { // try from 0020123f to 00201241 has its CatchHandler @ 002013b7 */
uStack_e0 = 0x201242;
(*(code *)*(CGameClient **)(_g_Telemetry + 0x50))();
pIVar16 = *(IThreadPool **)(this + 0x10);
local_48 = _g_Telemetry;
}
local_50 = local_7c;
local_4c = local_78;
if (*(IThreadPool **)(this + 0xc) < pIVar16) {
if (*(code **)(this + 4) != (code *)0x0) {
/* try { // try from 00201268 to 00201298 has its CatchHandler @ 0020136f */
uStack_e0 = 0x20126a;
(**(code **)(this + 4))();
pIVar16 = *(IThreadPool **)(this + 0x10);
}
while( true ) {
LOCK();
pIVar15 = *(IThreadPool **)local_9c;
*(uint *)local_9c = *(uint *)local_9c + 4;
UNLOCK();
if (pIVar16 <= pIVar15) break;
uStack_e0 = 0x20127d;
local_dc = pIVar15;
(**(code **)this)();
}
if (*(code **)(this + 8) != (code *)0x0) {
uStack_e0 = 0x201299;
(**(code **)(this + 8))();
}
}
if (local_48 != (IThreadPool *)0x0) {
local_d4[3] = 0;
local_d4[2] = 0;
local_d4[1] = 0;
local_d8 = local_50;
local_d4[0] = local_4c;
uStack_e0 = 0x2012cc;
local_dc = local_48;
(*(code *)*(CGameClient **)(local_48 + 0x54))();
}
goto LAB_002012cf;
}
iVar13 = param_2 - 1;
if (param_3 < (int)(param_2 - 1)) {
iVar13 = param_3;
}
}
else {
LOCK();
*(CGameClient ***)(this + 0xc) = param_1;
UNLOCK();
*(CGameClient ***)(this + 0x10) = param_1 + param_2;
iVar13 = param_2 - 1;
pIVar15 = param_4;
if (param_3 < (int)(param_2 - 1)) {
iVar13 = param_3;
}
}
local_9c = this + 0xc;
/* try { // try from 00200c35 to 00200d6d has its CatchHandler @ 002013b7 */
uStack_e0 = 0x200c38;
local_dc = pIVar15;
local_98 = (**(code **)(*(CGameClient **)pIVar15 + 0x1c))();
if (iVar13 <= local_98) {
local_98 = iVar13;
}
if (local_98 < 1) {
local_64 = (undefined4 ******)0x0;
local_60 = 0;
if (_g_Telemetry == (IThreadPool *)0x0) {
local_24 = (IThreadPool *)0x0;
}
else {
local_c4[4] = *(char **)(this + 0x14);
local_c4[3] = "DoExecute %s";
local_c4[2] = (char *)&DoExecute()::tm_fmt;
local_c4[1] = (char *)0x3a9;
local_c4[0] = "/data/src/public/vstdlib/jobthread.h";
local_d8 = &local_64;
local_d4[3] = 0;
local_d4[1] = 0;
local_d4[2] = 0;
local_d4[0] = 0;
local_dc = _g_Telemetry;
/* try { // try from 002010dc to 002010de has its CatchHandler @ 002013b7 */
uStack_e0 = 0x2010df;
(*(code *)*(CGameClient **)(_g_Telemetry + 0x50))();
local_24 = _g_Telemetry;
}
pIVar15 = *(IThreadPool **)(this + 0x10);
local_2c = local_64;
local_28 = local_60;
if (*(IThreadPool **)(this + 0xc) < pIVar15) {
if (*(code **)(this + 4) != (code *)0x0) {
/* try { // try from 00201105 to 00201130 has its CatchHandler @ 00201390 */
uStack_e0 = 0x201107;
(**(code **)(this + 4))();
pIVar15 = *(IThreadPool **)(this + 0x10);
}
while( true ) {
LOCK();
pIVar16 = *(IThreadPool **)local_9c;
*(uint *)local_9c = *(uint *)local_9c + 4;
UNLOCK();
if (pIVar15 <= pIVar16) break;
uStack_e0 = 0x201115;
local_dc = pIVar16;
(**(code **)this)();
}
if (*(code **)(this + 8) != (code *)0x0) {
uStack_e0 = 0x201131;
(**(code **)(this + 8))();
}
}
ppIVar17 = &local_dc;
if (local_24 != (IThreadPool *)0x0) {
local_d4[3] = 0;
local_d4[2] = 0;
local_d4[1] = 0;
local_d8 = local_2c;
local_d4[0] = local_28;
uStack_e0 = 0x201164;
local_dc = local_24;
(*(code *)*(CGameClient **)(local_24 + 0x54))();
ppIVar17 = &local_dc;
}
}
else {
iVar13 = local_98 + -1;
iVar6 = -((local_98 * 4 + 0xfU & 0xfffffff0) + 0x10);
local_90 = auStack_a0 + iVar6;
do {
pCVar2 = *(CGameClient **)(*(CGameClient **)pIVar15 + 0x54);
*(undefined4 *)((int)&local_dc + iVar6) = 0x1c;
local_94 = pCVar2;
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200c87;
puVar10 = operator_new(*(uint *)((int)&local_dc + iVar6));
puVar10[3] = 1;
*puVar10 = &PTR_AddRef_002c3a48;
puVar10[2] = &PTR__CMemberFunctor0_002c3a64;
puVar10[4] = DoExecute;
puVar10[5] = 0;
puVar10[6] = this;
*(undefined4 **)((int)local_d4 + iVar6 + -4) = puVar10;
pCVar2 = local_94;
*(undefined4 *)((int)local_d4 + iVar6 + 8) = 8;
*(undefined4 *)((int)local_d4 + iVar6 + 4) = 0;
*(int ***)((int)local_d4 + iVar6) = &local_88;
*(IThreadPool **)((int)&local_dc + iVar6) = pIVar15;
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200cd5;
(*(code *)pCVar2)();
piVar5 = local_88;
uVar11 = *(undefined4 *)(this + 0x14);
*(int **)(local_90 + iVar13 * 4) = local_88;
iVar12 = *local_88;
*(undefined4 *)((int)local_d4 + iVar6 + -4) = uVar11;
*(int **)((int)&local_dc + iVar6) = piVar5;
pcVar3 = *(code **)(iVar12 + 0x14);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200cf3;
(*pcVar3)();
iVar13 = iVar13 + -1;
} while (iVar13 != -1);
local_74 = (undefined4 ******)0x0;
local_70 = 0;
if (_g_Telemetry == (IThreadPool *)0x0) {
local_3c = (IThreadPool *)0x0;
}
else {
uVar11 = *(undefined4 *)(this + 0x14);
*(char **)((int)local_c4 + iVar6 + 0xc) = "DoExecute %s";
*(undefined4 **)((int)local_c4 + iVar6 + 8) = &DoExecute()::tm_fmt;
*(undefined4 *)((int)local_c4 + iVar6 + 4) = 0x3a9;
*(char **)((int)local_c4 + iVar6) = "/data/src/public/vstdlib/jobthread.h";
*(undefined4 *)((int)local_c4 + iVar6 + 0x10) = uVar11;
*(undefined4 *)((int)local_d4 + iVar6 + 0xc) = 0;
*(undefined4 *)((int)local_d4 + iVar6 + 4) = 0;
*(undefined4 *)((int)local_d4 + iVar6 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar6) = 0;
*(undefined4 *******)((int)local_d4 + iVar6 + -4) = &local_74;
*(IThreadPool **)((int)&local_dc + iVar6) = _g_Telemetry;
pCVar2 = *(CGameClient **)(_g_Telemetry + 0x50);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200d6e;
(*(code *)pCVar2)();
local_3c = _g_Telemetry;
}
local_44 = local_74;
uVar14 = *(uint *)(this + 0x10);
local_40 = local_70;
if (*(uint *)(this + 0xc) < uVar14) {
pcVar3 = *(code **)(this + 4);
if (pcVar3 != (code *)0x0) {
/* try { // try from 00200d94 to 00200dc0 has its CatchHandler @ 002013a4 */
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200d96;
(*pcVar3)();
uVar14 = *(uint *)(this + 0x10);
}
while( true ) {
LOCK();
uVar1 = *(uint *)local_9c;
*(uint *)local_9c = *(uint *)local_9c + 4;
UNLOCK();
if (uVar14 <= uVar1) break;
*(uint *)((int)&local_dc + iVar6) = uVar1;
pcVar3 = *(code **)this;
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200da5;
(*pcVar3)();
}
pcVar3 = *(code **)(this + 8);
if (pcVar3 != (code *)0x0) {
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200dc1;
(*pcVar3)();
}
}
pIVar15 = local_3c;
pppppuVar9 = local_44;
if (local_3c != (IThreadPool *)0x0) {
*(undefined4 *)((int)local_d4 + iVar6 + 0xc) = 0;
uVar14 = local_40;
*(undefined4 *)((int)local_d4 + iVar6 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar6 + 4) = 0;
*(IThreadPool **)((int)&local_dc + iVar6) = pIVar15;
*(undefined4 ******)((int)local_d4 + iVar6 + -4) = pppppuVar9;
*(uint *)((int)local_d4 + iVar6) = uVar14;
pCVar2 = *(CGameClient **)(pIVar15 + 0x54);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200df4;
(*(code *)pCVar2)();
}
iVar13 = 0;
do {
piVar5 = *(int **)(local_90 + iVar13 * 4);
iVar12 = piVar5[3];
if ((iVar12 - 1U < 2) || (iVar12 == 4)) {
local_6c = 0;
local_68 = 0;
if (_g_Telemetry == (IThreadPool *)0x0) {
local_30 = (IThreadPool *)0x0;
}
else {
local_9c = *(CParallelProcessor<CGameClient*,CFuncJobItemProcessor<CGameClient*>,1> **)
(_g_Telemetry + 0x50);
local_94 = *(CGameClient **)(_g_Telemetry + 0x14);
iVar4 = *piVar5;
*(int **)((int)&local_dc + iVar6) = piVar5;
/* try { // try from 00200e32 to 00200eaf has its CatchHandler @ 002013b7 */
pcVar3 = *(code **)(iVar4 + 0x10);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200e35;
uVar11 = (*pcVar3)();
*(undefined4 *)((int)local_d4 + iVar6 + -4) = uVar11;
*(IThreadPool **)((int)&local_dc + iVar6) = _g_Telemetry;
pCVar2 = local_94;
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200e49;
uVar11 = (*(code *)pCVar2)();
*(undefined4 *)((int)local_b0 + iVar6) = uVar11;
pCVar7 = local_9c;
*(undefined4 **)((int)local_d4 + iVar6 + -4) = &local_6c;
*(int *)((int)local_b0 + iVar6 + 4) = iVar12;
*(char **)((int)local_c4 + iVar6 + 0x10) = "Abort";
*(char **)((int)local_c4 + iVar6 + 0xc) = "%s %s %d";
*(undefined4 **)((int)local_c4 + iVar6 + 8) = &CJob::Abort(bool)::tm_fmt;
*(undefined4 *)((int)local_c4 + iVar6 + 4) = 0x52d;
*(char **)((int)local_c4 + iVar6) = "/data/src/public/vstdlib/jobthread.h";
*(undefined4 *)((int)local_d4 + iVar6 + 0xc) = 0;
*(undefined4 *)((int)local_d4 + iVar6 + 4) = 0;
*(undefined4 *)((int)local_d4 + iVar6 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar6) = 0;
*(IThreadPool **)((int)&local_dc + iVar6) = _g_Telemetry;
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200eb0;
(*(code *)pCVar7)();
local_30 = _g_Telemetry;
}
uVar8 = local_68;
uVar11 = local_6c;
*(int **)((int)&local_dc + iVar6) = piVar5 + 5;
local_38 = uVar11;
local_34 = uVar8;
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200ed0;
pthread_mutex_lock(*(pthread_mutex_t **)((int)&local_dc + iVar6));
puVar10 = (undefined4 *)*piVar5;
*(int **)((int)&local_dc + iVar6) = piVar5;
/* try { // try from 00200ed5 to 00200ef3 has its CatchHandler @ 002013b3 */
pcVar3 = (code *)*puVar10;
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200ed7;
(*pcVar3)();
if ((piVar5[3] == 1) || (piVar5[3] == 4)) {
local_44 = (undefined4 ******)0x0;
local_40 = 0;
if (_g_Telemetry == (IThreadPool *)0x0) {
local_24 = (IThreadPool *)0x0;
}
else {
*(char **)((int)local_c4 + iVar6 + 0xc) = "CJob::DoAbort";
*(undefined4 **)((int)local_c4 + iVar6 + 8) = &CJob::Abort(bool)::tm_fmt;
*(undefined4 *)((int)local_c4 + iVar6 + 4) = 0x539;
*(char **)((int)local_c4 + iVar6) = "/data/src/public/vstdlib/jobthread.h";
*(undefined4 *)((int)local_d4 + iVar6 + 0xc) = 0;
*(undefined4 *)((int)local_d4 + iVar6 + 4) = 0;
*(undefined4 *)((int)local_d4 + iVar6 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar6) = 0;
*(undefined4 *******)((int)local_d4 + iVar6 + -4) = &local_44;
*(IThreadPool **)((int)&local_dc + iVar6) = _g_Telemetry;
/* try { // try from 00200fd5 to 00200fd7 has its CatchHandler @ 002013b3 */
pCVar2 = *(CGameClient **)(_g_Telemetry + 0x50);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200fd8;
(*(code *)pCVar2)();
local_24 = _g_Telemetry;
}
iVar12 = *piVar5;
local_2c = local_44;
local_28 = local_40;
*(undefined4 *)((int)local_d4 + iVar6 + -4) = 1;
*(int **)((int)&local_dc + iVar6) = piVar5;
/* try { // try from 00200ffa to 00201012 has its CatchHandler @ 0020133c */
pcVar3 = *(code **)(iVar12 + 0x1c);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200ffd;
iVar12 = (*pcVar3)();
piVar5[3] = iVar12;
iVar12 = *piVar5;
*(int **)((int)&local_dc + iVar6) = piVar5;
pcVar3 = *(code **)(iVar12 + 0x20);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x201008;
(*pcVar3)();
*(int **)((int)&local_dc + iVar6) = piVar5 + 0x11;
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x201013;
CThreadEvent::Set();
pIVar15 = local_24;
pppppuVar9 = local_2c;
if (local_24 != (IThreadPool *)0x0) {
*(undefined4 *)((int)local_d4 + iVar6 + 0xc) = 0;
uVar14 = local_28;
*(undefined4 *)((int)local_d4 + iVar6 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar6 + 4) = 0;
*(IThreadPool **)((int)&local_dc + iVar6) = pIVar15;
*(undefined4 ******)((int)local_d4 + iVar6 + -4) = pppppuVar9;
*(uint *)((int)local_d4 + iVar6) = uVar14;
pCVar2 = *(CGameClient **)(pIVar15 + 0x54);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x20104a;
(*(code *)pCVar2)();
}
}
iVar12 = *piVar5;
*(int **)((int)&local_dc + iVar6) = piVar5;
pcVar3 = *(code **)(iVar12 + 4);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200ef4;
(*pcVar3)();
*(int **)((int)&local_dc + iVar6) = piVar5 + 5;
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200efc;
pthread_mutex_unlock(*(pthread_mutex_t **)((int)&local_dc + iVar6));
pIVar15 = local_30;
uVar11 = local_38;
if (local_30 != (IThreadPool *)0x0) {
*(undefined4 *)((int)local_d4 + iVar6 + 0xc) = 0;
uVar8 = local_34;
*(undefined4 *)((int)local_d4 + iVar6 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar6 + 4) = 0;
*(IThreadPool **)((int)&local_dc + iVar6) = pIVar15;
*(undefined4 *)((int)local_d4 + iVar6 + -4) = uVar11;
*(undefined4 *)((int)local_d4 + iVar6) = uVar8;
pCVar2 = *(CGameClient **)(pIVar15 + 0x54);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200f2f;
(*(code *)pCVar2)();
}
}
iVar12 = *piVar5;
*(int **)((int)&local_dc + iVar6) = piVar5;
/* try { // try from 00200f34 to 00200f36 has its CatchHandler @ 002013b7 */
pcVar3 = *(code **)(iVar12 + 4);
*(undefined4 *)((int)&uStack_e0 + iVar6) = 0x200f37;
(*pcVar3)();
iVar13 = iVar13 + 1;
ppIVar17 = (IThreadPool **)((int)&local_dc + iVar6);
} while (iVar13 != local_98);
}
pIVar15 = local_54;
pppppuVar9 = local_5c;
if (local_54 != (IThreadPool *)0x0) {
ppIVar17[5] = (IThreadPool *)0x0;
uVar14 = local_58;
ppIVar17[4] = (IThreadPool *)0x0;
ppIVar17[3] = (IThreadPool *)0x0;
*ppIVar17 = pIVar15;
ppIVar17[1] = (IThreadPool *)pppppuVar9;
ppIVar17[2] = (IThreadPool *)uVar14;
pCVar2 = *(CGameClient **)(pIVar15 + 0x54);
ppIVar17[-1] = (IThreadPool *)0x201197;
(*(code *)pCVar2)();
}
}
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(undefined1 **)((int)ppIVar17 + -4) = &LAB_002013a4;
__stack_chk_fail();
}
return;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.