From 82268d715e1b1ea6562fa5fb29d43d6e0d7e2c2c Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Sat, 19 Jan 2013 02:04:36 +0000 Subject: Explicitly stop PollServiceRequestManager() rather than relying on its destructor. Hopes to address occasional shutdown failures from http://opensimulator.org/mantis/view.php?id=6503 --- OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | 3 +++ .../Servers/HttpServer/PollServiceRequestManager.cs | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 8a0340f..aa49343 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -1623,6 +1623,7 @@ namespace OpenSim.Framework.Servers.HttpServer // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events m_PollServiceManager = new PollServiceRequestManager(this, 3, 25000); + m_PollServiceManager.Start(); HTTPDRunning = true; //HttpListenerContext context; @@ -1673,6 +1674,8 @@ namespace OpenSim.Framework.Servers.HttpServer HTTPDRunning = false; try { + m_PollServiceManager.Stop(); + m_httpListener2.ExceptionThrown -= httpServerException; //m_httpListener2.DisconnectHandler = null; diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index 8d50151..3e84c55 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs @@ -45,19 +45,26 @@ namespace OpenSim.Framework.Servers.HttpServer private uint m_WorkerThreadCount = 0; private Thread[] m_workerThreads; private PollServiceWorkerThread[] m_PollServiceWorkerThreads; - private bool m_running = true; + private volatile bool m_running = true; + private int m_pollTimeout; public PollServiceRequestManager(BaseHttpServer pSrv, uint pWorkerThreadCount, int pTimeout) { m_server = pSrv; m_WorkerThreadCount = pWorkerThreadCount; + m_pollTimeout = pTimeout; + } + + public void Start() + { + m_running = true; m_workerThreads = new Thread[m_WorkerThreadCount]; m_PollServiceWorkerThreads = new PollServiceWorkerThread[m_WorkerThreadCount]; //startup worker threads for (uint i = 0; i < m_WorkerThreadCount; i++) { - m_PollServiceWorkerThreads[i] = new PollServiceWorkerThread(m_server, pTimeout); + m_PollServiceWorkerThreads[i] = new PollServiceWorkerThread(m_server, m_pollTimeout); m_PollServiceWorkerThreads[i].ReQueue += ReQueueEvent; m_workerThreads[i] @@ -136,8 +143,10 @@ namespace OpenSim.Framework.Servers.HttpServer } - ~PollServiceRequestManager() + public void Stop() { + m_running = false; + foreach (object o in m_requests) { PollServiceHttpRequest req = (PollServiceHttpRequest) o; @@ -151,8 +160,6 @@ namespace OpenSim.Framework.Servers.HttpServer { t.Abort(); } - - m_running = false; } } } \ No newline at end of file -- cgit v1.1