CParallelProcessor<PackWork_t,CFuncJobItemProcessor<PackWork_t>,1>::Run
0x002076e0 · 2013 bytes · __thiscall
_ZN18CParallelProcessorI10PackWork_t21CFuncJobItemProcessorIS0_ELi1EE3RunEPS0_jiP11IThreadPool
Decompiled
undefined (5 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CParallelProcessor<PackWork_t, CFuncJobItemProcessor<PackWork_t>, 1>::Run(PackWork_t*, unsigned
int, int, IThreadPool*) */
void __thiscall
CParallelProcessor<PackWork_t,CFuncJobItemProcessor<PackWork_t>,1>::Run
(CParallelProcessor<PackWork_t,CFuncJobItemProcessor<PackWork_t>,1> *this,
PackWork_t *param_1,uint param_2,int param_3,IThreadPool *param_4)
{
uint uVar1;
code *pcVar2;
int iVar3;
int *piVar4;
int iVar5;
CParallelProcessor<PackWork_t,CFuncJobItemProcessor<PackWork_t>,1> *pCVar6;
undefined4 uVar7;
undefined4 *****pppppuVar8;
undefined4 *puVar9;
undefined4 uVar10;
int iVar11;
int iVar12;
uint uVar13;
PackWork_t *pPVar14;
PackWork_t *pPVar15;
PackWork_t **ppPVar16;
int in_GS_OFFSET;
undefined4 uStack_e0;
PackWork_t *local_dc;
undefined4 *****local_d8;
uint local_d4 [4];
char *local_c4 [5];
uint local_b0 [4];
undefined1 auStack_a0 [4];
CParallelProcessor<PackWork_t,CFuncJobItemProcessor<PackWork_t>,1> *local_9c;
int local_98;
code *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;
PackWork_t *local_54;
undefined4 *****local_50;
uint local_4c;
PackWork_t *local_48;
undefined4 *****local_44;
uint local_40;
PackWork_t *local_3c;
undefined4 local_38;
undefined4 local_34;
PackWork_t *local_30;
undefined4 *****local_2c;
uint local_28;
PackWork_t *local_24;
int local_20;
local_84 = (undefined4 ******)0x0;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_80 = 0;
if (_g_Telemetry == (PackWork_t *)0x0) {
local_54 = (PackWork_t *)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(PackWork_t*,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 = 0x207776;
(**(code **)(_g_Telemetry + 0x50))();
local_54 = _g_Telemetry;
}
pPVar14 = _g_pThreadPool;
local_5c = local_84;
local_58 = local_80;
if (param_2 == 0) {
LAB_00207e6f:
ppPVar16 = &local_dc;
if (local_54 != (PackWork_t *)0x0) {
local_d4[3] = 0;
local_d4[2] = 0;
local_d4[1] = 0;
local_d8 = local_5c;
local_d4[0] = local_58;
uStack_e0 = 0x207ea3;
local_dc = local_54;
(**(code **)(local_54 + 0x54))();
ppPVar16 = &local_dc;
}
}
else {
if (param_4 == (IThreadPool *)0x0) {
local_9c = this + 0xc;
LOCK();
*(PackWork_t **)local_9c = param_1;
UNLOCK();
pPVar15 = param_1 + param_2 * 0xc;
*(PackWork_t **)(this + 0x10) = pPVar15;
if (pPVar14 == (PackWork_t *)0x0) {
local_7c = (undefined4 ******)0x0;
local_78 = 0;
if (_g_Telemetry == (PackWork_t *)0x0) {
local_48 = (PackWork_t *)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 00207de2 to 00207de4 has its CatchHandler @ 00207f57 */
uStack_e0 = 0x207de5;
(**(code **)(_g_Telemetry + 0x50))();
pPVar15 = *(PackWork_t **)(this + 0x10);
local_48 = _g_Telemetry;
}
local_50 = local_7c;
local_4c = local_78;
if (*(PackWork_t **)(this + 0xc) < pPVar15) {
if (*(code **)(this + 4) != (code *)0x0) {
/* try { // try from 00207e0b to 00207e38 has its CatchHandler @ 00207f0f */
uStack_e0 = 0x207e0d;
(**(code **)(this + 4))();
pPVar15 = *(PackWork_t **)(this + 0x10);
}
while( true ) {
LOCK();
pPVar14 = *(PackWork_t **)local_9c;
*(uint *)local_9c = *(uint *)local_9c + 0xc;
UNLOCK();
if (pPVar15 <= pPVar14) break;
uStack_e0 = 0x207e1d;
local_dc = pPVar14;
(**(code **)this)();
}
if (*(code **)(this + 8) != (code *)0x0) {
uStack_e0 = 0x207e39;
(**(code **)(this + 8))();
}
}
if (local_48 != (PackWork_t *)0x0) {
local_d4[3] = 0;
local_d4[2] = 0;
local_d4[1] = 0;
local_d8 = local_50;
local_d4[0] = local_4c;
uStack_e0 = 0x207e6c;
local_dc = local_48;
(**(code **)(local_48 + 0x54))();
}
goto LAB_00207e6f;
}
iVar12 = param_2 - 1;
if (param_3 < (int)(param_2 - 1)) {
iVar12 = param_3;
}
}
else {
LOCK();
*(PackWork_t **)(this + 0xc) = param_1;
UNLOCK();
*(PackWork_t **)(this + 0x10) = param_1 + param_2 * 0xc;
iVar12 = param_2 - 1;
pPVar14 = (PackWork_t *)param_4;
if (param_3 < (int)(param_2 - 1)) {
iVar12 = param_3;
}
}
local_9c = this + 0xc;
/* try { // try from 002077c8 to 00207905 has its CatchHandler @ 00207f57 */
uStack_e0 = 0x2077cb;
local_dc = pPVar14;
local_98 = (**(code **)(*(int *)pPVar14 + 0x1c))();
if (iVar12 <= local_98) {
local_98 = iVar12;
}
if (local_98 < 1) {
local_64 = (undefined4 ******)0x0;
local_60 = 0;
if (_g_Telemetry == (PackWork_t *)0x0) {
local_24 = (PackWork_t *)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 00207c7c to 00207c7e has its CatchHandler @ 00207f57 */
uStack_e0 = 0x207c7f;
(**(code **)(_g_Telemetry + 0x50))();
local_24 = _g_Telemetry;
}
pPVar14 = *(PackWork_t **)(this + 0x10);
local_2c = local_64;
local_28 = local_60;
if (*(PackWork_t **)(this + 0xc) < pPVar14) {
if (*(code **)(this + 4) != (code *)0x0) {
/* try { // try from 00207ca5 to 00207cd0 has its CatchHandler @ 00207f30 */
uStack_e0 = 0x207ca7;
(**(code **)(this + 4))();
pPVar14 = *(PackWork_t **)(this + 0x10);
}
while( true ) {
LOCK();
pPVar15 = *(PackWork_t **)local_9c;
*(uint *)local_9c = *(uint *)local_9c + 0xc;
UNLOCK();
if (pPVar14 <= pPVar15) break;
uStack_e0 = 0x207cb5;
local_dc = pPVar15;
(**(code **)this)();
}
if (*(code **)(this + 8) != (code *)0x0) {
uStack_e0 = 0x207cd1;
(**(code **)(this + 8))();
}
}
ppPVar16 = &local_dc;
if (local_24 != (PackWork_t *)0x0) {
local_d4[3] = 0;
local_d4[2] = 0;
local_d4[1] = 0;
local_d8 = local_2c;
local_d4[0] = local_28;
uStack_e0 = 0x207d04;
local_dc = local_24;
(**(code **)(local_24 + 0x54))();
ppPVar16 = &local_dc;
}
}
else {
iVar12 = local_98 + -1;
iVar5 = -((local_98 * 4 + 0xfU & 0xfffffff0) + 0x10);
local_90 = auStack_a0 + iVar5;
do {
pcVar2 = *(code **)(*(int *)pPVar14 + 0x54);
*(undefined4 *)((int)&local_dc + iVar5) = 0x1c;
local_94 = pcVar2;
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x20781f;
puVar9 = operator_new(*(uint *)((int)&local_dc + iVar5));
puVar9[3] = 1;
*puVar9 = &PTR_AddRef_002c44e8;
puVar9[2] = &PTR__CMemberFunctor0_002c4504;
puVar9[4] = DoExecute;
puVar9[5] = 0;
puVar9[6] = this;
*(undefined4 **)((int)local_d4 + iVar5 + -4) = puVar9;
pcVar2 = local_94;
*(undefined4 *)((int)local_d4 + iVar5 + 8) = 8;
*(undefined4 *)((int)local_d4 + iVar5 + 4) = 0;
*(int ***)((int)local_d4 + iVar5) = &local_88;
*(PackWork_t **)((int)&local_dc + iVar5) = pPVar14;
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x20786d;
(*pcVar2)();
piVar4 = local_88;
uVar10 = *(undefined4 *)(this + 0x14);
*(int **)(local_90 + iVar12 * 4) = local_88;
iVar11 = *local_88;
*(undefined4 *)((int)local_d4 + iVar5 + -4) = uVar10;
*(int **)((int)&local_dc + iVar5) = piVar4;
pcVar2 = *(code **)(iVar11 + 0x14);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x20788b;
(*pcVar2)();
iVar12 = iVar12 + -1;
} while (iVar12 != -1);
local_74 = (undefined4 ******)0x0;
local_70 = 0;
if (_g_Telemetry == (PackWork_t *)0x0) {
local_3c = (PackWork_t *)0x0;
}
else {
uVar10 = *(undefined4 *)(this + 0x14);
*(char **)((int)local_c4 + iVar5 + 0xc) = "DoExecute %s";
*(undefined4 **)((int)local_c4 + iVar5 + 8) = &DoExecute()::tm_fmt;
*(undefined4 *)((int)local_c4 + iVar5 + 4) = 0x3a9;
*(char **)((int)local_c4 + iVar5) = "/data/src/public/vstdlib/jobthread.h";
*(undefined4 *)((int)local_c4 + iVar5 + 0x10) = uVar10;
*(undefined4 *)((int)local_d4 + iVar5 + 0xc) = 0;
*(undefined4 *)((int)local_d4 + iVar5 + 4) = 0;
*(undefined4 *)((int)local_d4 + iVar5 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar5) = 0;
*(undefined4 *******)((int)local_d4 + iVar5 + -4) = &local_74;
*(PackWork_t **)((int)&local_dc + iVar5) = _g_Telemetry;
pcVar2 = *(code **)(_g_Telemetry + 0x50);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207906;
(*pcVar2)();
local_3c = _g_Telemetry;
}
local_44 = local_74;
uVar13 = *(uint *)(this + 0x10);
local_40 = local_70;
if (*(uint *)(this + 0xc) < uVar13) {
pcVar2 = *(code **)(this + 4);
if (pcVar2 != (code *)0x0) {
/* try { // try from 0020792c to 00207958 has its CatchHandler @ 00207f44 */
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x20792e;
(*pcVar2)();
uVar13 = *(uint *)(this + 0x10);
}
while( true ) {
LOCK();
uVar1 = *(uint *)local_9c;
*(uint *)local_9c = *(uint *)local_9c + 0xc;
UNLOCK();
if (uVar13 <= uVar1) break;
*(uint *)((int)&local_dc + iVar5) = uVar1;
pcVar2 = *(code **)this;
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x20793d;
(*pcVar2)();
}
pcVar2 = *(code **)(this + 8);
if (pcVar2 != (code *)0x0) {
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207959;
(*pcVar2)();
}
}
pPVar14 = local_3c;
pppppuVar8 = local_44;
if (local_3c != (PackWork_t *)0x0) {
*(undefined4 *)((int)local_d4 + iVar5 + 0xc) = 0;
uVar13 = local_40;
*(undefined4 *)((int)local_d4 + iVar5 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar5 + 4) = 0;
*(PackWork_t **)((int)&local_dc + iVar5) = pPVar14;
*(undefined4 ******)((int)local_d4 + iVar5 + -4) = pppppuVar8;
*(uint *)((int)local_d4 + iVar5) = uVar13;
pcVar2 = *(code **)(pPVar14 + 0x54);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x20798c;
(*pcVar2)();
}
iVar12 = 0;
do {
piVar4 = *(int **)(local_90 + iVar12 * 4);
iVar11 = piVar4[3];
if ((iVar11 - 1U < 2) || (iVar11 == 4)) {
local_6c = 0;
local_68 = 0;
if (_g_Telemetry == (PackWork_t *)0x0) {
local_30 = (PackWork_t *)0x0;
}
else {
local_9c = *(CParallelProcessor<PackWork_t,CFuncJobItemProcessor<PackWork_t>,1> **)
(_g_Telemetry + 0x50);
local_94 = *(code **)(_g_Telemetry + 0x14);
iVar3 = *piVar4;
*(int **)((int)&local_dc + iVar5) = piVar4;
/* try { // try from 002079ca to 00207a47 has its CatchHandler @ 00207f57 */
pcVar2 = *(code **)(iVar3 + 0x10);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x2079cd;
uVar10 = (*pcVar2)();
*(undefined4 *)((int)local_d4 + iVar5 + -4) = uVar10;
*(PackWork_t **)((int)&local_dc + iVar5) = _g_Telemetry;
pcVar2 = local_94;
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x2079e1;
uVar10 = (*pcVar2)();
*(undefined4 *)((int)local_b0 + iVar5) = uVar10;
pCVar6 = local_9c;
*(undefined4 **)((int)local_d4 + iVar5 + -4) = &local_6c;
*(int *)((int)local_b0 + iVar5 + 4) = iVar11;
*(char **)((int)local_c4 + iVar5 + 0x10) = "Abort";
*(char **)((int)local_c4 + iVar5 + 0xc) = "%s %s %d";
*(undefined4 **)((int)local_c4 + iVar5 + 8) = &CJob::Abort(bool)::tm_fmt;
*(undefined4 *)((int)local_c4 + iVar5 + 4) = 0x52d;
*(char **)((int)local_c4 + iVar5) = "/data/src/public/vstdlib/jobthread.h";
*(undefined4 *)((int)local_d4 + iVar5 + 0xc) = 0;
*(undefined4 *)((int)local_d4 + iVar5 + 4) = 0;
*(undefined4 *)((int)local_d4 + iVar5 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar5) = 0;
*(PackWork_t **)((int)&local_dc + iVar5) = _g_Telemetry;
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207a48;
(*(code *)pCVar6)();
local_30 = _g_Telemetry;
}
uVar7 = local_68;
uVar10 = local_6c;
*(int **)((int)&local_dc + iVar5) = piVar4 + 5;
local_38 = uVar10;
local_34 = uVar7;
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207a68;
pthread_mutex_lock(*(pthread_mutex_t **)((int)&local_dc + iVar5));
puVar9 = (undefined4 *)*piVar4;
*(int **)((int)&local_dc + iVar5) = piVar4;
/* try { // try from 00207a6d to 00207a8b has its CatchHandler @ 00207f53 */
pcVar2 = (code *)*puVar9;
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207a6f;
(*pcVar2)();
if ((piVar4[3] == 1) || (piVar4[3] == 4)) {
local_44 = (undefined4 ******)0x0;
local_40 = 0;
if (_g_Telemetry == (PackWork_t *)0x0) {
local_24 = (PackWork_t *)0x0;
}
else {
*(char **)((int)local_c4 + iVar5 + 0xc) = "CJob::DoAbort";
*(undefined4 **)((int)local_c4 + iVar5 + 8) = &CJob::Abort(bool)::tm_fmt;
*(undefined4 *)((int)local_c4 + iVar5 + 4) = 0x539;
*(char **)((int)local_c4 + iVar5) = "/data/src/public/vstdlib/jobthread.h";
*(undefined4 *)((int)local_d4 + iVar5 + 0xc) = 0;
*(undefined4 *)((int)local_d4 + iVar5 + 4) = 0;
*(undefined4 *)((int)local_d4 + iVar5 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar5) = 0;
*(undefined4 *******)((int)local_d4 + iVar5 + -4) = &local_44;
*(PackWork_t **)((int)&local_dc + iVar5) = _g_Telemetry;
/* try { // try from 00207b6d to 00207b6f has its CatchHandler @ 00207f53 */
pcVar2 = *(code **)(_g_Telemetry + 0x50);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207b70;
(*pcVar2)();
local_24 = _g_Telemetry;
}
iVar11 = *piVar4;
local_2c = local_44;
local_28 = local_40;
*(undefined4 *)((int)local_d4 + iVar5 + -4) = 1;
*(int **)((int)&local_dc + iVar5) = piVar4;
/* try { // try from 00207b92 to 00207baa has its CatchHandler @ 00207edc */
pcVar2 = *(code **)(iVar11 + 0x1c);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207b95;
iVar11 = (*pcVar2)();
piVar4[3] = iVar11;
iVar11 = *piVar4;
*(int **)((int)&local_dc + iVar5) = piVar4;
pcVar2 = *(code **)(iVar11 + 0x20);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207ba0;
(*pcVar2)();
*(int **)((int)&local_dc + iVar5) = piVar4 + 0x11;
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207bab;
CThreadEvent::Set();
pPVar14 = local_24;
pppppuVar8 = local_2c;
if (local_24 != (PackWork_t *)0x0) {
*(undefined4 *)((int)local_d4 + iVar5 + 0xc) = 0;
uVar13 = local_28;
*(undefined4 *)((int)local_d4 + iVar5 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar5 + 4) = 0;
*(PackWork_t **)((int)&local_dc + iVar5) = pPVar14;
*(undefined4 ******)((int)local_d4 + iVar5 + -4) = pppppuVar8;
*(uint *)((int)local_d4 + iVar5) = uVar13;
pcVar2 = *(code **)(pPVar14 + 0x54);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207be2;
(*pcVar2)();
}
}
iVar11 = *piVar4;
*(int **)((int)&local_dc + iVar5) = piVar4;
pcVar2 = *(code **)(iVar11 + 4);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207a8c;
(*pcVar2)();
*(int **)((int)&local_dc + iVar5) = piVar4 + 5;
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207a94;
pthread_mutex_unlock(*(pthread_mutex_t **)((int)&local_dc + iVar5));
pPVar14 = local_30;
uVar10 = local_38;
if (local_30 != (PackWork_t *)0x0) {
*(undefined4 *)((int)local_d4 + iVar5 + 0xc) = 0;
uVar7 = local_34;
*(undefined4 *)((int)local_d4 + iVar5 + 8) = 0;
*(undefined4 *)((int)local_d4 + iVar5 + 4) = 0;
*(PackWork_t **)((int)&local_dc + iVar5) = pPVar14;
*(undefined4 *)((int)local_d4 + iVar5 + -4) = uVar10;
*(undefined4 *)((int)local_d4 + iVar5) = uVar7;
pcVar2 = *(code **)(pPVar14 + 0x54);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207ac7;
(*pcVar2)();
}
}
iVar11 = *piVar4;
*(int **)((int)&local_dc + iVar5) = piVar4;
/* try { // try from 00207acc to 00207ace has its CatchHandler @ 00207f57 */
pcVar2 = *(code **)(iVar11 + 4);
*(undefined4 *)((int)&uStack_e0 + iVar5) = 0x207acf;
(*pcVar2)();
iVar12 = iVar12 + 1;
ppPVar16 = (PackWork_t **)((int)&local_dc + iVar5);
} while (iVar12 != local_98);
}
pPVar14 = local_54;
pppppuVar8 = local_5c;
if (local_54 != (PackWork_t *)0x0) {
ppPVar16[5] = (PackWork_t *)0x0;
uVar13 = local_58;
ppPVar16[4] = (PackWork_t *)0x0;
ppPVar16[3] = (PackWork_t *)0x0;
*ppPVar16 = pPVar14;
ppPVar16[1] = (PackWork_t *)pppppuVar8;
ppPVar16[2] = (PackWork_t *)uVar13;
pcVar2 = *(code **)(pPVar14 + 0x54);
ppPVar16[-1] = (PackWork_t *)0x207d37;
(*pcVar2)();
}
}
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(undefined1 **)((int)ppPVar16 + -4) = &LAB_00207f44;
__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.