[Threading] Make the game run single-threaded

This commit is contained in:
momo5502 2016-12-05 20:43:16 +01:00
parent ef263d35c1
commit 68548ad45a
4 changed files with 65 additions and 0 deletions

View File

@ -55,6 +55,7 @@ namespace Components
Loader::Register(new FastFiles());
Loader::Register(new Gametypes());
Loader::Register(new Materials());
Loader::Register(new Threading());
#ifndef DISABLE_BITMESSAGE
Loader::Register(new BitMessage());
#endif

View File

@ -70,6 +70,7 @@ namespace Components
#include "Modules\Gametypes.hpp"
#include "Modules\Materials.hpp"
#include "Modules\Singleton.hpp"
#include "Modules\Threading.hpp"
#include "Modules\BitMessage.hpp"
#include "Modules\FileSystem.hpp"
#include "Modules\ModelSurfs.hpp"

View File

@ -0,0 +1,47 @@
#include "STDInclude.hpp"
namespace Components
{
__declspec(naked) void Threading::FrameEpilogueStub()
{
__asm
{
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
retn
}
}
__declspec(naked) void Threading::PacketEventStub()
{
__asm
{
mov eax, 49F0B0h
call eax
mov eax, 458160h
jmp eax
}
}
Threading::Threading()
{
// remove starting of server thread from Com_Init_Try_Block_Function
Utils::Hook::Nop(0x60BEC0, 5);
// make server thread function jump to per-frame stuff
Utils::Hook(0x627049, 0x6271CE, HOOK_JUMP).install()->quick();
// make SV_WaitServer insta-return
Utils::Hook::Set<BYTE>(0x4256F0, 0xC3);
// dvar setting function, unknown stuff related to server thread sync
Utils::Hook::Set<BYTE>(0x647781, 0xEB);
Utils::Hook(0x627695, 0x627040, HOOK_CALL).install()->quick();
Utils::Hook(0x43D1C7, Threading::PacketEventStub, HOOK_JUMP).install()->quick();
Utils::Hook(0x6272E3, Threading::FrameEpilogueStub, HOOK_JUMP).install()->quick();
}
}

View File

@ -0,0 +1,16 @@
namespace Components
{
class Threading : public Component
{
public:
Threading();
#if defined(DEBUG) || defined(FORCE_UNIT_TESTS)
const char* getName() { return "Threading"; };
#endif
private:
static void FrameEpilogueStub();
static void PacketEventStub();
};
}