Clean up the core side of the logic bridge.

This commit is contained in:
David Anderson 2015-08-29 21:46:05 -04:00
parent 9e4d396d5e
commit 38e1c2f1f3
2 changed files with 97 additions and 86 deletions

View File

@ -52,13 +52,17 @@ using namespace SourceHook;
* Add 1 to the RHS of this expression to bump the intercom file * Add 1 to the RHS of this expression to bump the intercom file
* This is to prevent mismatching core/logic binaries * This is to prevent mismatching core/logic binaries
*/ */
#define SM_LOGIC_MAGIC (0x0F47C0DE - 45) #define SM_LOGIC_MAGIC (0x0F47C0DE - 46)
#if defined SM_LOGIC #if defined SM_LOGIC
class IVEngineServer # define IVEngineClass IVEngineServer
# define IFileSystemClass IFileSystem
#else #else
class IVEngineServer_Logic # define IVEngineClass IVEngineServer_Logic
# define IFileSystemClass IFileSystem_Logic
#endif #endif
class IVEngineClass
{ {
public: public:
virtual bool IsDedicatedServer() = 0; virtual bool IsDedicatedServer() = 0;
@ -73,11 +77,7 @@ public:
typedef void * FileHandle_t; typedef void * FileHandle_t;
typedef int FileFindHandle_t; typedef int FileFindHandle_t;
#if defined SM_LOGIC class IFileSystemClass
class IFileSystem
#else
class IFileSystem_Logic
#endif
{ {
public: public:
virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0; virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0;
@ -123,8 +123,6 @@ namespace SourceMod
class ICommandArgs; class ICommandArgs;
} }
class IVEngineServer;
class IFileSystem;
class ConVar; class ConVar;
class KeyValues; class KeyValues;
class SMGlobalClass; class SMGlobalClass;
@ -280,8 +278,8 @@ class CoreProvider
public: public:
/* Objects */ /* Objects */
ISourceMod *sm; ISourceMod *sm;
IVEngineServer *engine; IVEngineClass *engine;
IFileSystem *filesystem; IFileSystemClass *filesystem;
IPlayerInfo_Logic *playerInfo; IPlayerInfo_Logic *playerInfo;
ITimerSystem *timersys; ITimerSystem *timersys;
IPlayerManager *playerhelpers; IPlayerManager *playerhelpers;

View File

@ -74,21 +74,19 @@
# define MATCHMAKINGDS_EXT "so" # define MATCHMAKINGDS_EXT "so"
#endif #endif
static ke::Ref<ke::SharedLib> g_Logic;
static LogicInitFunction logic_init_fn;
IThreader *g_pThreader;
ITextParsers *textparsers;
sm_logic_t logicore; sm_logic_t logicore;
ITranslator *translator;
IScriptManager *scripts; IThreader *g_pThreader = nullptr;
IShareSys *sharesys; ITextParsers *textparsers = nullptr;
IExtensionSys *extsys; ITranslator *translator = nullptr;
IHandleSys *handlesys; IScriptManager *scripts = nullptr;
IForwardManager *forwardsys; IShareSys *sharesys = nullptr;
IAdminSystem *adminsys; IExtensionSys *extsys = nullptr;
ILogger *logger; IHandleSys *handlesys = nullptr;
IRootConsole *rootmenu; IForwardManager *forwardsys = nullptr;
IAdminSystem *adminsys = nullptr;
ILogger *logger = nullptr;
IRootConsole *rootmenu = nullptr;
class VEngineServer_Logic : public IVEngineServer_Logic class VEngineServer_Logic : public IVEngineServer_Logic
{ {
@ -131,9 +129,6 @@ public:
} }
}; };
static VEngineServer_Logic logic_engine;
class VFileSystem_Logic : public IFileSystem_Logic class VFileSystem_Logic : public IFileSystem_Logic
{ {
public: public:
@ -223,8 +218,6 @@ public:
} }
}; };
static VFileSystem_Logic logic_filesystem;
class VPlayerInfo_Logic : public IPlayerInfo_Logic class VPlayerInfo_Logic : public IPlayerInfo_Logic
{ {
public: public:
@ -294,8 +287,6 @@ public:
} }
}; };
static VPlayerInfo_Logic logic_playerinfo;
static ConVar sm_show_activity("sm_show_activity", "13", FCVAR_SPONLY, "Activity display setting (see sourcemod.cfg)"); static ConVar sm_show_activity("sm_show_activity", "13", FCVAR_SPONLY, "Activity display setting (see sourcemod.cfg)");
static ConVar sm_immunity_mode("sm_immunity_mode", "1", FCVAR_SPONLY, "Mode for deciding immunity protection"); static ConVar sm_immunity_mode("sm_immunity_mode", "1", FCVAR_SPONLY, "Mode for deciding immunity protection");
static ConVar sm_datetime_format("sm_datetime_format", "%m/%d/%Y - %H:%M:%S", 0, "Default formatting time rules"); static ConVar sm_datetime_format("sm_datetime_format", "%m/%d/%Y - %H:%M:%S", 0, "Default formatting time rules");
@ -428,9 +419,9 @@ public:
CoreProviderImpl() CoreProviderImpl()
{ {
this->sm = &g_SourceMod; this->sm = &g_SourceMod;
this->engine = reinterpret_cast<IVEngineServer*>(&logic_engine); this->engine = &engine_wrapper_;
this->filesystem = reinterpret_cast<IFileSystem*>(&logic_filesystem); this->filesystem = &fs_wrapper_;
this->playerInfo = &logic_playerinfo; this->playerInfo = &playerinfo_wrapper_;
this->timersys = &g_Timers; this->timersys = &g_Timers;
this->playerhelpers = &g_Players; this->playerhelpers = &g_Players;
this->gamehelpers = &g_HL2; this->gamehelpers = &g_HL2;
@ -455,6 +446,12 @@ public:
this->listeners = nullptr; this->listeners = nullptr;
} }
// Local functions.
void InitializeBridge();
bool LoadBridge(char *error, size_t maxlength);
void ShutdownBridge();
// Provider implementation.
ConVar *FindConVar(const char *name) override; ConVar *FindConVar(const char *name) override;
const char *GetCvarString(ConVar *cvar) override; const char *GetCvarString(ConVar *cvar) override;
bool GetCvarBool(ConVar* cvar) override; bool GetCvarBool(ConVar* cvar) override;
@ -471,6 +468,13 @@ public:
void ConsolePrintVa(const char *fmt, va_list ap) override; void ConsolePrintVa(const char *fmt, va_list ap) override;
int LoadMMSPlugin(const char *file, bool *ok, char *error, size_t maxlength) override; int LoadMMSPlugin(const char *file, bool *ok, char *error, size_t maxlength) override;
void UnloadMMSPlugin(int id) override; void UnloadMMSPlugin(int id) override;
private:
ke::Ref<ke::SharedLib> logic_;
LogicInitFunction logic_init_;
VEngineServer_Logic engine_wrapper_;
VFileSystem_Logic fs_wrapper_;
VPlayerInfo_Logic playerinfo_wrapper_;
} sCoreProviderImpl; } sCoreProviderImpl;
ConVar *CoreProviderImpl::FindConVar(const char *name) ConVar *CoreProviderImpl::FindConVar(const char *name)
@ -664,35 +668,35 @@ void CoreProviderImpl::UnloadMMSPlugin(int id)
g_pMMPlugins->Unload(id, true, ignore, sizeof(ignore)); g_pMMPlugins->Unload(id, true, ignore, sizeof(ignore));
} }
void InitLogicBridge() void CoreProviderImpl::InitializeBridge()
{ {
serverGlobals.universalTime = g_pUniversalTime; ::serverGlobals.universalTime = g_pUniversalTime;
serverGlobals.frametime = &gpGlobals->frametime; ::serverGlobals.frametime = &gpGlobals->frametime;
serverGlobals.interval_per_tick = &gpGlobals->interval_per_tick; ::serverGlobals.interval_per_tick = &gpGlobals->interval_per_tick;
sCoreProviderImpl.engineFactory = (void *)g_SMAPI->GetEngineFactory(false); this->engineFactory = (void *)g_SMAPI->GetEngineFactory(false);
sCoreProviderImpl.serverFactory = (void *)g_SMAPI->GetServerFactory(false); this->serverFactory = (void *)g_SMAPI->GetServerFactory(false);
sCoreProviderImpl.listeners = SMGlobalClass::head; this->listeners = SMGlobalClass::head;
char path[PLATFORM_MAX_PATH]; char path[PLATFORM_MAX_PATH];
ke::path::Format(path, sizeof(path), "%s/bin/matchmaking_ds%s.%s", g_SMAPI->GetBaseDir(), MATCHMAKINGDS_SUFFIX, MATCHMAKINGDS_EXT); ke::path::Format(path, sizeof(path),
"%s/bin/matchmaking_ds%s.%s",
g_SMAPI->GetBaseDir(),
MATCHMAKINGDS_SUFFIX,
MATCHMAKINGDS_EXT);
if (ke::Ref<ke::SharedLib> mmlib = ke::SharedLib::Open(path, NULL, 0)) if (ke::Ref<ke::SharedLib> mmlib = ke::SharedLib::Open(path, NULL, 0)) {
{ this->matchmakingDSFactory =
sCoreProviderImpl.matchmakingDSFactory =
mmlib->get<decltype(sCoreProviderImpl.matchmakingDSFactory)>("CreateInterface"); mmlib->get<decltype(sCoreProviderImpl.matchmakingDSFactory)>("CreateInterface");
} }
logic_init_fn(&sCoreProviderImpl, &logicore); logic_init_(this, &logicore);
/* Add SMGlobalClass instances */ // Join logic's SMGlobalClass instances.
SMGlobalClass* glob = SMGlobalClass::head; SMGlobalClass* glob = SMGlobalClass::head;
while (glob->m_pGlobalClassNext != NULL) while (glob->m_pGlobalClassNext)
{
glob = glob->m_pGlobalClassNext; glob = glob->m_pGlobalClassNext;
}
assert(glob->m_pGlobalClassNext == NULL);
glob->m_pGlobalClassNext = logicore.head; glob->m_pGlobalClassNext = logicore.head;
g_pThreader = logicore.threader; g_pThreader = logicore.threader;
@ -708,7 +712,7 @@ void InitLogicBridge()
rootmenu = logicore.rootmenu; rootmenu = logicore.rootmenu;
} }
bool StartLogicBridge(char *error, size_t maxlength) bool CoreProviderImpl::LoadBridge(char *error, size_t maxlength)
{ {
char file[PLATFORM_MAX_PATH]; char file[PLATFORM_MAX_PATH];
@ -719,37 +723,46 @@ bool StartLogicBridge(char *error, size_t maxlength)
g_SourceMod.GetSourceModPath()); g_SourceMod.GetSourceModPath());
char myerror[255]; char myerror[255];
g_Logic = ke::SharedLib::Open(file, myerror, sizeof(myerror)); logic_ = ke::SharedLib::Open(file, myerror, sizeof(myerror));
if (!g_Logic) if (!logic_) {
{ ke::SafeSprintf(error, maxlength, "failed to load %s: %s", file, myerror);
if (error && maxlength)
{
UTIL_Format(error, maxlength, "failed to load %s: %s", file, myerror);
}
return false; return false;
} }
LogicLoadFunction llf = g_Logic->get<decltype(llf)>("logic_load"); LogicLoadFunction llf = logic_->get<decltype(llf)>("logic_load");
if (llf == NULL) if (!llf) {
{ logic_ = nullptr;
g_Logic = nullptr; ke::SafeSprintf(error, maxlength, "could not find logic_load function");
if (error && maxlength)
{
UTIL_Format(error, maxlength, "could not find logic_load function");
}
return false; return false;
} }
GetITextParsers getitxt = g_Logic->get<decltype(getitxt)>("get_textparsers"); GetITextParsers getitxt = logic_->get<decltype(getitxt)>("get_textparsers");
textparsers = getitxt(); textparsers = getitxt();
logic_init_fn = llf(SM_LOGIC_MAGIC); logic_init_ = llf(SM_LOGIC_MAGIC);
if (!logic_init_) {
ke::SafeSprintf(error, maxlength, "component version mismatch");
return false;
}
return true; return true;
} }
void CoreProviderImpl::ShutdownBridge()
{
logic_ = nullptr;
}
void InitLogicBridge()
{
sCoreProviderImpl.InitializeBridge();
}
bool StartLogicBridge(char *error, size_t maxlength)
{
return sCoreProviderImpl.LoadBridge(error, maxlength);
}
void ShutdownLogicBridge() void ShutdownLogicBridge()
{ {
g_Logic = nullptr; sCoreProviderImpl.ShutdownBridge();
} }