removed a few TODOs and filled out some PluginSys stuff

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40287
This commit is contained in:
David Anderson 2007-01-11 01:13:34 +00:00
parent f30dfedeeb
commit 09b01f7950
6 changed files with 104 additions and 55 deletions

View File

@ -36,9 +36,10 @@ namespace SourceMod
Plugin_Running=0, /* Plugin is running */ Plugin_Running=0, /* Plugin is running */
/* All states below are unexecutable */ /* All states below are unexecutable */
Plugin_Paused, /* Plugin is loaded but paused */ Plugin_Paused, /* Plugin is loaded but paused */
Plugin_Error, /* Plugin is loaded but errored/locked */
/* All states below do not have all natives */ /* All states below do not have all natives */
Plugin_Loaded, /* Plugin has passed loading and can be finalized */ Plugin_Loaded, /* Plugin has passed loading and can be finalized */
Plugin_Error, /* Plugin has a blocking error */ Plugin_Failed, /* Plugin has a fatal failure */
Plugin_Created, /* Plugin is created but not initialized */ Plugin_Created, /* Plugin is created but not initialized */
Plugin_Uncompiled, /* Plugin is not yet compiled by the JIT */ Plugin_Uncompiled, /* Plugin is not yet compiled by the JIT */
Plugin_BadLoad, /* Plugin failed to load */ Plugin_BadLoad, /* Plugin failed to load */

View File

@ -192,6 +192,16 @@ CON_COMMAND(sm, "SourceMod Menu")
META_CONPRINT(" unload - Unload a plugin\n"); META_CONPRINT(" unload - Unload a plugin\n");
META_CONPRINT(" info - Information about a plugin\n"); META_CONPRINT(" info - Information about a plugin\n");
return; return;
} else if (!strcmp("credits", cmd)) {
META_CONPRINTF(" SourceMod was developed by AlliedModders, LLC.\n");
META_CONPRINTF(" Development would not have been possible without the following people:\n");
META_CONPRINTF(" David \"BAILOPAN\" Anderson, lead developer\n");
META_CONPRINTF(" Borja \"faluco\" Ferrer, Core developer\n");
META_CONPRINTF(" Scott \"Damaged Soul\" Ehlert, SourceMM developer\n");
META_CONPRINTF(" Pavol \"PM OnoTo\" Marko, SourceHook developer\n");
META_CONPRINTF(" Special thanks to Viper of GameConnect, and Mani\n");
META_CONPRINTF(" http://www.sourcemod.net/\n");
return;
} else if (!strcmp("version", cmd)) { } else if (!strcmp("version", cmd)) {
META_CONPRINT(" SourceMod Version Information:\n"); META_CONPRINT(" SourceMod Version Information:\n");
META_CONPRINTF(" SourceMod Version: \"%s\"\n", SOURCEMOD_VERSION); META_CONPRINTF(" SourceMod Version: \"%s\"\n", SOURCEMOD_VERSION);
@ -203,6 +213,7 @@ CON_COMMAND(sm, "SourceMod Menu")
} }
META_CONPRINT(" SourceMod Menu:\n"); META_CONPRINT(" SourceMod Menu:\n");
META_CONPRINT(" Usage: sm <command> [arguments]\n"); META_CONPRINT(" Usage: sm <command> [arguments]\n");
META_CONPRINT(" credits - Credits listing\n");
META_CONPRINT(" plugins - Plugins menu\n"); META_CONPRINT(" plugins - Plugins menu\n");
META_CONPRINT(" version - Display version information\n"); META_CONPRINT(" version - Display version information\n");
} }

View File

@ -65,7 +65,7 @@ static cell_t sm_CloneHandle(IPluginContext *pContext, const cell_t *params)
} else if (err == HandleError_None) { } else if (err == HandleError_None) {
return new_hndl; return new_hndl;
} else { } else {
return pContext->ThrowNativeError("Handle to clone %x is invalid (error %d)", hndl, err); return pContext->ThrowNativeError("Handle %x cannot be cloned because it is invalid (error %d)", hndl, err);
} }
} }

View File

@ -8,24 +8,9 @@ CForwardManager g_Forwards;
* Gensis turns to its source, reduction occurs stepwise although the essence is all one. * Gensis turns to its source, reduction occurs stepwise although the essence is all one.
* End of line. FTL system check. * End of line. FTL system check.
* *
* :TODO: Implement the manager. ho ho ho * :TODO: WHAT NEEDS TO BE TESTED IN THIS BEAST
*
* :TODO: WHAT NEEDS TO BE TESTED IN THIS BEAST (X=done, -=TODO)
* NORMAL FUNCTIONS:
* X Push cells
* X Push cells byref (copyback tested = yes)
* X Push floats
* X Push floats byref (copyback tested = yes)
* X Push arrays (copyback tested = yes)
* X Push strings (copyback tested = yes)
* VARARG FUNCTIONS: * VARARG FUNCTIONS:
* - Pushing no varargs * - Pushing no varargs
* X Push vararg cells (copyback should be verified to not happen = didnt happen)
* X Push vararg cells byref (copyback tested = yes)
* X Push vararg floats (copyback should be verified to not happen = didnt happen)
* X Push vararg floats byref (copyback tested = yes)
* X Push vararg arrays (copyback tested = yes)
* X Push vararg strings (copyback tested = :TODO:)
*/ */
// :TODO: IMPORTANT!!! The result pointer arg in the execute function maybe invalid if the forward fails // :TODO: IMPORTANT!!! The result pointer arg in the execute function maybe invalid if the forward fails
@ -646,7 +631,7 @@ bool CForward::AddFunction(IPluginFunction *func)
return false; return false;
} }
//:TODO: eventually we will tell the plugin we're using it [?] //:IDEA: eventually we will tell the plugin we're using it [?]
m_functions.push_back(func); m_functions.push_back(func);
return true; return true;

View File

@ -6,6 +6,7 @@
#include "sourcemm_api.h" #include "sourcemm_api.h"
#include "sourcemod.h" #include "sourcemod.h"
#include "CTextParsers.h" #include "CTextParsers.h"
#include "CLogger.h"
CPluginManager g_PluginSys; CPluginManager g_PluginSys;
HandleType_t g_PluginType = 0; HandleType_t g_PluginType = 0;
@ -186,7 +187,7 @@ bool CPlugin::FinishMyCompile(char *error, size_t maxlength)
memset(&m_ctx, 0, sizeof(m_ctx)); memset(&m_ctx, 0, sizeof(m_ctx));
if (!error) if (!error)
{ {
SetErrorState(Plugin_Error, "Failed to compile (error %d)", err); SetErrorState(Plugin_Failed, "Failed to compile (error %d)", err);
} else { } else {
snprintf(error, maxlength, "Failed to compile (error %d)", err); snprintf(error, maxlength, "Failed to compile (error %d)", err);
} }
@ -341,7 +342,6 @@ void CPlugin::Call_OnPluginInit()
m_status = Plugin_Running; m_status = Plugin_Running;
int err;
cell_t result; cell_t result;
IPluginFunction *pFunction = GetFunctionByName("OnPluginInit"); IPluginFunction *pFunction = GetFunctionByName("OnPluginInit");
if (!pFunction) if (!pFunction)
@ -349,13 +349,25 @@ void CPlugin::Call_OnPluginInit()
return; return;
} }
/* :TODO: push our own handle */
pFunction->PushCell(m_handle); pFunction->PushCell(m_handle);
if ((err=pFunction->Execute(&result)) != SP_ERROR_NONE) pFunction->Execute(&result);
}
void CPlugin::Call_OnPluginUnload()
{
if (m_status < Plugin_Paused)
{ {
/* :TODO: log into debugger instead */ return;
SetErrorState(Plugin_Error, "Runtime error %d", err);
} }
cell_t result;
IPluginFunction *pFunction = GetFunctionByName("OnPluginUnload");
if (!pFunction)
{
return;
}
pFunction->Execute(&result);
} }
bool CPlugin::Call_AskPluginLoad(char *error, size_t maxlength) bool CPlugin::Call_AskPluginLoad(char *error, size_t maxlength)
@ -388,15 +400,13 @@ bool CPlugin::Call_AskPluginLoad(char *error, size_t maxlength)
pFunction->PushCell(maxlength); pFunction->PushCell(maxlength);
if ((err=pFunction->Execute(&result)) != SP_ERROR_NONE) if ((err=pFunction->Execute(&result)) != SP_ERROR_NONE)
{ {
/* :TODO: debugging system */ m_status = Plugin_Failed;
snprintf(error, maxlength, "Plugin load returned run time error %d", err);
m_status = Plugin_Error;
return false; return false;
} }
if (!result) if (!result || m_status != Plugin_Loaded)
{ {
m_status = Plugin_Error; m_status = Plugin_Failed;
return false; return false;
} }
@ -461,8 +471,14 @@ bool CPlugin::SetPauseState(bool paused)
} else if (!paused && GetStatus() != Plugin_Running) { } else if (!paused && GetStatus() != Plugin_Running) {
return false; return false;
} }
/* :TODO: execute some forwards or some crap */ IPluginFunction *pFunction = GetFunctionByName("OnPluginPauseChange");
if (pFunction)
{
cell_t result;
pFunction->PushCell(paused ? 1 : 0);
pFunction->Execute(&result);
}
return true; return true;
} }
@ -524,7 +540,11 @@ CPluginManager::CPluginManager()
CPluginManager::~CPluginManager() CPluginManager::~CPluginManager()
{ {
//:TODO: we need a good way to free what we're holding /* :NOTICE:
* Ignore the fact that there might be plugins in the cache.
* This usually means that Core is not being unloaded properly, and everything
* will crash anyway. YAY
*/
sm_trie_destroy(m_LoadLookup); sm_trie_destroy(m_LoadLookup);
} }
@ -537,7 +557,12 @@ void CPluginManager::LoadAll_FirstPass(const char *config, const char *basedir)
m_AllPluginsLoaded = false; m_AllPluginsLoaded = false;
if ((err=g_TextParser.ParseFile_SMC(config, &m_PluginInfo, &line, &col)) != SMCParse_Okay) if ((err=g_TextParser.ParseFile_SMC(config, &m_PluginInfo, &line, &col)) != SMCParse_Okay)
{ {
/* :TODO: log the error, don't bail out though */ g_Logger.LogError("[SOURCEMOD] Encountered fatal error parsing file \"%s\"", config);
const char *err_msg = g_TextParser.GetSMCErrorString(err);
if (err_msg)
{
g_Logger.LogError("[SOURCEMOD] Parse error encountered: \"%s\"", err_msg);
}
} }
LoadPluginsFromDir(basedir, NULL); LoadPluginsFromDir(basedir, NULL);
@ -559,8 +584,10 @@ void CPluginManager::LoadPluginsFromDir(const char *basedir, const char *localpa
if (!dir) if (!dir)
{ {
//:TODO: write a logger and LOG THIS UP, BABY char error[256];
//g_LibSys.GetPlatformError(error, err_max); g_LibSys.GetPlatformError(error, sizeof(error));
g_Logger.LogError("[SOURCEMOD] Failure reading from plugins path: %s", localpath);
g_Logger.LogError("[SOURCEMOD] Platform returned error: %s", error);
return; return;
} }
@ -622,7 +649,8 @@ void CPluginManager::LoadAutoPlugin(const char *file)
} }
/* Check to see if we should try reloading it */ /* Check to see if we should try reloading it */
if (pPlugin->GetStatus() == Plugin_BadLoad if (pPlugin->GetStatus() == Plugin_BadLoad
|| pPlugin->GetStatus() == Plugin_Error) || pPlugin->GetStatus() == Plugin_Error
|| pPlugin->GetStatus() == Plugin_Failed)
{ {
UnloadPlugin(pPlugin); UnloadPlugin(pPlugin);
} }
@ -663,7 +691,7 @@ void CPluginManager::LoadAutoPlugin(const char *file)
} }
if (!g_pVM->SetCompilationOption(co, key, val)) if (!g_pVM->SetCompilationOption(co, key, val))
{ {
pPlugin->SetErrorState(Plugin_Error, "Unable to set option (key \"%s\") (value \"%s\")", key, val); pPlugin->SetErrorState(Plugin_Failed, "Unable to set option (key \"%s\") (value \"%s\")", key, val);
pPlugin->CancelMyCompile(); pPlugin->CancelMyCompile();
co = NULL; co = NULL;
break; break;
@ -819,20 +847,33 @@ void CPluginManager::AddCoreNativesToPlugin(CPlugin *pPlugin)
bool CPluginManager::UnloadPlugin(IPlugin *plugin) bool CPluginManager::UnloadPlugin(IPlugin *plugin)
{ {
CPlugin *pPlugin = (CPlugin *)plugin; CPlugin *pPlugin = (CPlugin *)plugin;
/* :TODO: More */
List<IPluginsListener *>::iterator iter; List<IPluginsListener *>::iterator iter;
IPluginsListener *pListener; IPluginsListener *pListener;
if (pPlugin->GetStatus() >= Plugin_Error)
{
/* Notify listeners of unloading */
for (iter=m_listeners.begin(); iter!=m_listeners.end(); iter++)
{
pListener = (*iter);
pListener->OnPluginUnloaded(pPlugin);
}
/* Notify plugin */
pPlugin->Call_OnPluginUnload();
}
for (iter=m_listeners.begin(); iter!=m_listeners.end(); iter++) for (iter=m_listeners.begin(); iter!=m_listeners.end(); iter++)
{ {
/* Notify listeners of destruction */
pListener = (*iter); pListener = (*iter);
pListener->OnPluginDestroyed(pPlugin); pListener->OnPluginDestroyed(pPlugin);
} }
/* Remove us from the lookup table and linked list */
m_plugins.remove(pPlugin); m_plugins.remove(pPlugin);
sm_trie_delete(m_LoadLookup, pPlugin->m_filename); sm_trie_delete(m_LoadLookup, pPlugin->m_filename);
/* Tell the plugin to delete itself */
delete pPlugin; delete pPlugin;
return true; return true;

View File

@ -129,7 +129,7 @@ public:
/** /**
* Calls the OnPluginLoad function, and sets any failed states if necessary. * Calls the OnPluginLoad function, and sets any failed states if necessary.
* NOTE: Valid pre-states are: Plugin_Created * NOTE: Valid pre-states are: Plugin_Created
* If validated, plugin state is changed to Plugin_Loaded * NOTE: If validated, plugin state is changed to Plugin_Loaded
* *
* If the error buffer is NULL, the error message is cached locally. * If the error buffer is NULL, the error message is cached locally.
*/ */
@ -138,11 +138,21 @@ public:
/** /**
* Calls the OnPluginInit function. * Calls the OnPluginInit function.
* NOTE: Valid pre-states are: Plugin_Created * NOTE: Valid pre-states are: Plugin_Created
* NOTE: Pre-state will be changed to Plugin_Running * NOTE: Post-state will be Plugin_Running
*/ */
void Call_OnPluginInit(); void Call_OnPluginInit();
/**
* Calls the OnPluginUnload function.
*/
void Call_OnPluginUnload();
public: public:
time_t HasUpdatedFile(); time_t HasUpdatedFile();
/**
* Returns true if the plugin was running, but is now invalid.
*/
bool WasRunning();
protected: protected:
void UpdateInfo(); void UpdateInfo();
private: private:
@ -160,6 +170,7 @@ private:
time_t m_LastAccess; time_t m_LastAccess;
IdentityToken_t *m_ident; IdentityToken_t *m_ident;
Handle_t m_handle; Handle_t m_handle;
bool m_WasRunning;
}; };
class CPluginManager : class CPluginManager :
@ -181,7 +192,7 @@ public:
virtual bool MorePlugins(); virtual bool MorePlugins();
virtual IPlugin *GetPlugin(); virtual IPlugin *GetPlugin();
virtual void NextPlugin(); virtual void NextPlugin();
virtual void Release(); void Release();
public: public:
void Reset(); void Reset();
private: private:
@ -190,22 +201,22 @@ public:
}; };
friend class CPluginManager::CPluginIterator; friend class CPluginManager::CPluginIterator;
public: //IPluginManager public: //IPluginManager
virtual IPlugin *LoadPlugin(const char *path, IPlugin *LoadPlugin(const char *path,
bool debug, bool debug,
PluginType type, PluginType type,
char error[], char error[],
size_t err_max); size_t err_max);
virtual bool UnloadPlugin(IPlugin *plugin); bool UnloadPlugin(IPlugin *plugin);
virtual IPlugin *FindPluginByContext(const sp_context_t *ctx); IPlugin *FindPluginByContext(const sp_context_t *ctx);
virtual unsigned int GetPluginCount(); unsigned int GetPluginCount();
virtual IPluginIterator *GetPluginIterator(); IPluginIterator *GetPluginIterator();
virtual void AddPluginsListener(IPluginsListener *listener); void AddPluginsListener(IPluginsListener *listener);
virtual void RemovePluginsListener(IPluginsListener *listener); void RemovePluginsListener(IPluginsListener *listener);
public: //SMGlobalClass public: //SMGlobalClass
virtual void OnSourceModAllInitialized(); void OnSourceModAllInitialized();
virtual void OnSourceModShutdown(); void OnSourceModShutdown();
public: //IHandleTypeDispatch public: //IHandleTypeDispatch
virtual void OnHandleDestroy(HandleType_t type, void *object); void OnHandleDestroy(HandleType_t type, void *object);
public: public:
/** /**
* Loads all plugins not yet loaded * Loads all plugins not yet loaded