Webternet: Implemented clean extension unload shutdown

This commit is contained in:
Nefarius 2014-06-05 15:29:36 +02:00 committed by Nicholas Hastings
parent 5b701aec7a
commit 94770f0772
2 changed files with 47 additions and 30 deletions

View File

@ -104,7 +104,7 @@ void CurlExt::SDK_OnUnload()
g_pHandleSys->RemoveType(g_DownloadHandle, myself->GetIdentity());
plsys->RemovePluginsListener(this);
smutils->RemoveGameFrameHook(&OnGameFrame);
g_SessionManager.Cleanup();
g_SessionManager.Shutdown();
curl_global_cleanup();
}
@ -757,6 +757,48 @@ void HTTPSessionManager::RunFrame()
pRequestsLock->Unlock();
}
RemoveFinishedThreads();
}
void HTTPSessionManager::Initialize()
{
pRequestsLock = threader->MakeMutex();
pCallbacksLock = threader->MakeMutex();
}
void HTTPSessionManager::Shutdown()
{
// Block until all running threads have finished
while (!this->threads.empty())
{
this->RemoveFinishedThreads();
}
// Destroy all remaining callback calls
this->pCallbacksLock->Lock();
this->callbacks.clear();
this->pCallbacksLock->Unlock();
if (pRequestsLock != NULL)
{
pRequestsLock->DestroyThis();
}
if (pCallbacksLock != NULL)
{
pCallbacksLock->DestroyThis();
}
}
void HTTPSessionManager::AddCallback(HTTPRequest request)
{
this->pCallbacksLock->Lock();
this->callbacks.push_front(request);
this->pCallbacksLock->Unlock();
}
void HTTPSessionManager::RemoveFinishedThreads()
{
// Do some quick "garbage collection" on finished threads
if (!this->threads.empty())
{
@ -777,32 +819,6 @@ void HTTPSessionManager::RunFrame()
}
}
void HTTPSessionManager::Initialize()
{
pRequestsLock = threader->MakeMutex();
pCallbacksLock = threader->MakeMutex();
}
void HTTPSessionManager::Cleanup()
{
if (pRequestsLock != NULL)
{
pRequestsLock->DestroyThis();
}
if (pCallbacksLock != NULL)
{
pCallbacksLock->DestroyThis();
}
}
void HTTPSessionManager::AddCallback(HTTPRequest request)
{
this->pCallbacksLock->Lock();
this->callbacks.push_front(request);
this->pCallbacksLock->Unlock();
}
void HTTPSessionManager::HTTPAsyncRequestHandler::RunThread(IThreadHandle *pHandle)
{
HandleError err;

View File

@ -196,7 +196,7 @@ public:
~HTTPSessionManager() {}
void Initialize();
void Cleanup();
void Shutdown();
void PluginUnloaded(IPlugin *plugin);
void RunFrame();
void BurnSessionHandle(IPluginContext * pCtx, HTTPRequestHandleSet &handles);
@ -231,6 +231,9 @@ private:
cell_t result;
};
void RemoveFinishedThreads();
void AddCallback(HTTPRequest request);
static const unsigned int iMaxRequestsPerFrame = 20;
IMutex *pRequestsLock;
std::deque<HTTPRequest> requests;
@ -257,8 +260,6 @@ private:
}
static void ExecuteCallback(void *data);
};
void AddCallback(HTTPRequest request);
};
void OnGameFrame(bool simulating);