diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/MaintenanceThread.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/MaintenanceThread.cs | 86 |
1 files changed, 56 insertions, 30 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/MaintenanceThread.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/MaintenanceThread.cs index 9536291..105d47f 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/MaintenanceThread.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/MaintenanceThread.cs | |||
@@ -8,7 +8,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
8 | /// <summary> | 8 | /// <summary> |
9 | /// This class does maintenance on script engine. | 9 | /// This class does maintenance on script engine. |
10 | /// </summary> | 10 | /// </summary> |
11 | public class MaintenanceThread | 11 | public class MaintenanceThread : iScriptEngineFunctionModule |
12 | { | 12 | { |
13 | public ScriptEngine m_ScriptEngine; | 13 | public ScriptEngine m_ScriptEngine; |
14 | private int MaintenanceLoopms; | 14 | private int MaintenanceLoopms; |
@@ -28,7 +28,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
28 | StopMaintenanceThread(); | 28 | StopMaintenanceThread(); |
29 | } | 29 | } |
30 | 30 | ||
31 | private void ReadConfig() | 31 | public void ReadConfig() |
32 | { | 32 | { |
33 | MaintenanceLoopms = m_ScriptEngine.ScriptConfigSource.GetInt("MaintenanceLoopms", 50); | 33 | MaintenanceLoopms = m_ScriptEngine.ScriptConfigSource.GetInt("MaintenanceLoopms", 50); |
34 | } | 34 | } |
@@ -80,48 +80,74 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
80 | /// </summary> | 80 | /// </summary> |
81 | public void MaintenanceLoop() | 81 | public void MaintenanceLoop() |
82 | { | 82 | { |
83 | try | 83 | if (m_ScriptEngine.m_EventQueueManager.maxFunctionExecutionTimens < MaintenanceLoopms) |
84 | m_ScriptEngine.Log.Warn(m_ScriptEngine.ScriptEngineName, | ||
85 | "Configuration error: MaxEventExecutionTimeMs is less than MaintenanceLoopms. The Maintenance Loop will only check scripts once per run."); | ||
86 | |||
87 | while (true) | ||
84 | { | 88 | { |
85 | long Last_maxFunctionExecutionTimens = 0;// DateTime.Now.Ticks; | 89 | try |
86 | long Last_ReReadConfigFilens = DateTime.Now.Ticks; | ||
87 | while (true) | ||
88 | { | 90 | { |
89 | System.Threading.Thread.Sleep(MaintenanceLoopms); // Sleep | 91 | long Last_maxFunctionExecutionTimens = 0; // DateTime.Now.Ticks; |
90 | 92 | long Last_ReReadConfigFilens = DateTime.Now.Ticks; | |
91 | // Re-reading config every x seconds? | 93 | while (true) |
92 | if (m_ScriptEngine.ReReadConfigFileSeconds > 0) | ||
93 | { | 94 | { |
94 | // Check if its time to re-read config | 95 | System.Threading.Thread.Sleep(MaintenanceLoopms); // Sleep before next pass |
95 | if (DateTime.Now.Ticks - Last_ReReadConfigFilens > m_ScriptEngine.ReReadConfigFilens) | 96 | if (PleaseShutdown) |
97 | return; | ||
98 | // | ||
99 | // Re-reading config every x seconds | ||
100 | // | ||
101 | if (m_ScriptEngine.RefreshConfigFileSeconds > 0) | ||
96 | { | 102 | { |
97 | // Its time to re-read config file | 103 | // Check if its time to re-read config |
98 | m_ScriptEngine.ConfigSource.Reload(); // Re-read config | 104 | if (DateTime.Now.Ticks - Last_ReReadConfigFilens > m_ScriptEngine.RefreshConfigFilens) |
99 | Last_ReReadConfigFilens = DateTime.Now.Ticks; // Reset time | 105 | { |
106 | // Its time to re-read config file | ||
107 | m_ScriptEngine.ConfigSource.Reload(); // Refresh config | ||
108 | m_ScriptEngine.ReadConfig(); | ||
109 | Last_ReReadConfigFilens = DateTime.Now.Ticks; // Reset time | ||
110 | } | ||
100 | } | 111 | } |
101 | } | ||
102 | 112 | ||
103 | // Adjust number of running script threads if not correct | 113 | // |
104 | if (m_ScriptEngine.m_EventQueueManager.eventQueueThreads.Count != m_ScriptEngine.m_EventQueueManager.numberOfThreads) | 114 | // Adjust number of running script threads if not correct |
105 | { | 115 | // |
106 | m_ScriptEngine.m_EventQueueManager.AdjustNumberOfScriptThreads(); | 116 | m_ScriptEngine.m_EventQueueManager.AdjustNumberOfScriptThreads(); |
107 | } | ||
108 | |||
109 | 117 | ||
110 | // Check if any script has exceeded its max execution time | 118 | // |
111 | if (m_ScriptEngine.m_EventQueueManager.EnforceMaxExecutionTime) | 119 | // Check if any script has exceeded its max execution time |
112 | { | 120 | // |
113 | if (DateTime.Now.Ticks - Last_maxFunctionExecutionTimens > m_ScriptEngine.m_EventQueueManager.maxFunctionExecutionTimens) | 121 | if (m_ScriptEngine.m_EventQueueManager.EnforceMaxExecutionTime) |
114 | { | 122 | { |
115 | m_ScriptEngine.m_EventQueueManager.CheckScriptMaxExecTime(); // Do check | 123 | // We are enforcing execution time |
116 | Last_maxFunctionExecutionTimens = DateTime.Now.Ticks; // Reset time | 124 | if (DateTime.Now.Ticks - Last_maxFunctionExecutionTimens > |
125 | m_ScriptEngine.m_EventQueueManager.maxFunctionExecutionTimens) | ||
126 | { | ||
127 | // Its time to check again | ||
128 | m_ScriptEngine.m_EventQueueManager.CheckScriptMaxExecTime(); // Do check | ||
129 | Last_maxFunctionExecutionTimens = DateTime.Now.Ticks; // Reset time | ||
130 | } | ||
117 | } | 131 | } |
118 | } | 132 | } |
119 | } | 133 | } |
120 | } | 134 | catch (Exception ex) |
121 | catch (ThreadAbortException tae) | 135 | { |
122 | { | 136 | m_ScriptEngine.Log.Error(m_ScriptEngine.ScriptEngineName, "Exception in MaintenanceLoopThread. Thread will recover after 5 sec throttle. Exception: " + ex.ToString()); |
137 | Thread.Sleep(5000); | ||
138 | } | ||
123 | } | 139 | } |
124 | } | 140 | } |
125 | #endregion | 141 | #endregion |
142 | /// <summary> | ||
143 | /// If set to true then threads and stuff should try to make a graceful exit | ||
144 | /// </summary> | ||
145 | public bool PleaseShutdown | ||
146 | { | ||
147 | get { return _PleaseShutdown; } | ||
148 | set { _PleaseShutdown = value; } | ||
149 | } | ||
150 | private bool _PleaseShutdown = false; | ||
151 | |||
126 | } | 152 | } |
127 | } | 153 | } |