From 999ce009a81870b0a5fe894cbce1a1341fdf5363 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Mon, 1 Apr 2024 01:02:02 +0200 Subject: [PATCH] Engine: properly deal with server frame thread commands/convars Marked convars/concommands as FCVAR_SERVER_FRAME_THREAD and removed main thread dispatching code and comments that are no longer in effect. In the RCONServer execute handler, a ThreadJoinServerJob() is placed if the commandbase is flagged FCVAR_SERVER_FRAME_THREAD since RCON dispatches the command, or sets the convar directly. --- r5dev/engine/server/sv_rcon.cpp | 3 +++ r5dev/game/server/ai_utility.cpp | 8 +++++++- r5dev/game/server/vscript_server.cpp | 2 +- r5dev/rtech/liveapi/liveapi.cpp | 2 -- r5dev/vscript/vscript.cpp | 12 +----------- 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/r5dev/engine/server/sv_rcon.cpp b/r5dev/engine/server/sv_rcon.cpp index fdac5d5d..7e6789a3 100644 --- a/r5dev/engine/server/sv_rcon.cpp +++ b/r5dev/engine/server/sv_rcon.cpp @@ -523,6 +523,9 @@ void CRConServer::Execute(const cl_rcon::request& request) const const char* const pValueString = request.requestval().c_str(); + if (pCommandBase->IsFlagSet(FCVAR_SERVER_FRAME_THREAD)) + ThreadJoinServerJob(); + if (!pCommandBase->IsCommand()) { // Here we want to skip over the command string in the value buffer. diff --git a/r5dev/game/server/ai_utility.cpp b/r5dev/game/server/ai_utility.cpp index f0aa8836..d82e5a88 100644 --- a/r5dev/game/server/ai_utility.cpp +++ b/r5dev/game/server/ai_utility.cpp @@ -128,12 +128,18 @@ bool Detour_IsLoaded() //----------------------------------------------------------------------------- void Detour_HotSwap() { + Assert(ThreadInMainOrServerFrameThread()); + + // TODO: CodeCallback_OnNavMeshHotSwapStart() + // Free and re-init NavMesh. Detour_LevelShutdown(); v_Detour_LevelInit(); if (!Detour_IsLoaded()) Error(eDLL_T::SERVER, NOERROR, "%s - Failed to hot swap NavMesh\n", __FUNCTION__); + + // TODO: CodeCallback_OnNavMeshHotSwapEnd() } /* @@ -161,7 +167,7 @@ static void Detour_HotSwap_f() Msg(eDLL_T::SERVER, "Hot swap took '%lf' seconds\n", timer.GetDuration().GetSeconds()); } -static ConCommand navmesh_hotswap("navmesh_hotswap", Detour_HotSwap_f, "Hot swap the NavMesh for all hulls", FCVAR_DEVELOPMENTONLY); +static ConCommand navmesh_hotswap("navmesh_hotswap", Detour_HotSwap_f, "Hot swap the NavMesh for all hulls", FCVAR_DEVELOPMENTONLY | FCVAR_SERVER_FRAME_THREAD); /////////////////////////////////////////////////////////////////////////////// void VRecast::Detour(const bool bAttach) const diff --git a/r5dev/game/server/vscript_server.cpp b/r5dev/game/server/vscript_server.cpp index d037a9ae..e06d060a 100644 --- a/r5dev/game/server/vscript_server.cpp +++ b/r5dev/game/server/vscript_server.cpp @@ -34,7 +34,7 @@ static void SQVM_ServerScript_f(const CCommand& args) Script_Execute(args.ArgS(), SQCONTEXT::SERVER); } } -static ConCommand script("script", SQVM_ServerScript_f, "Run input code as SERVER script on the VM", FCVAR_DEVELOPMENTONLY | FCVAR_GAMEDLL | FCVAR_CHEAT); +static ConCommand script("script", SQVM_ServerScript_f, "Run input code as SERVER script on the VM", FCVAR_DEVELOPMENTONLY | FCVAR_GAMEDLL | FCVAR_CHEAT | FCVAR_SERVER_FRAME_THREAD); namespace VScriptCode { diff --git a/r5dev/rtech/liveapi/liveapi.cpp b/r5dev/rtech/liveapi/liveapi.cpp index 515b5556..e48b49cd 100644 --- a/r5dev/rtech/liveapi/liveapi.cpp +++ b/r5dev/rtech/liveapi/liveapi.cpp @@ -15,7 +15,6 @@ //----------------------------------------------------------------------------- static void LiveAPI_ParamsChangedCallback(IConVar* var, const char* pOldValue) { - // TODO[ AMOS ]: latch this off to the server frame thread! LiveAPISystem()->UpdateParams(); } @@ -24,7 +23,6 @@ static void LiveAPI_ParamsChangedCallback(IConVar* var, const char* pOldValue) //----------------------------------------------------------------------------- static void LiveAPI_AddressChangedCallback(IConVar* var, const char* pOldValue) { - // TODO[ AMOS ]: latch this off to the server frame thread! LiveAPISystem()->InstallAddressList(); } diff --git a/r5dev/vscript/vscript.cpp b/r5dev/vscript/vscript.cpp index ababaf01..8fcec3b4 100644 --- a/r5dev/vscript/vscript.cpp +++ b/r5dev/vscript/vscript.cpp @@ -133,17 +133,7 @@ SQBool Script_PrecompileClientScripts(CSquirrelVM* vm) void Script_Execute(const SQChar* code, const SQCONTEXT context) { Assert(context != SQCONTEXT::NONE); - - if (!ThreadInMainThread()) // TODO[ AMOS ]: server frame thread - { - const string scode(code); - g_TaskQueue.Dispatch([scode, context]() - { - Script_Execute(scode.c_str(), context); - }, 0); - - return; // Only run in main thread. - } + Assert(ThreadInMainOrServerFrameThread()); CSquirrelVM* s = Script_GetScriptHandle(context); const char* const contextName = s_scriptContextNames[(int)context];