public EventManager(ScriptEngine _ScriptEngine, bool performHookUp) { myScriptEngine = _ScriptEngine; ReadConfig(); if (performHookUp) { myScriptEngine.World.EventManager.OnRezScript += OnRezScript; } }
//public AppDomainManager(ScriptEngine scriptEngine) public AppDomainManager(ScriptEngine scriptEngine) { m_scriptEngine = scriptEngine; ReadConfig(); }
public void DoProcessQueue() { foreach (ScriptEngine m_ScriptEngine in new ArrayList(ScriptEngine.ScriptEngines)) { lastScriptEngine = m_ScriptEngine; EventQueueManager.QueueItemStruct QIS = BlankQIS; bool GotItem = false; //if (PleaseShutdown) // return; if (m_ScriptEngine.m_EventQueueManager == null || m_ScriptEngine.m_EventQueueManager.eventQueue == null) continue; if (m_ScriptEngine.m_EventQueueManager.eventQueue.Count == 0) { // Nothing to do? Sleep a bit waiting for something to do Thread.Sleep(nothingToDoSleepms); } else { // Something in queue, process // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME // OBJECT IS NOT GOOD lock (m_ScriptEngine.m_EventQueueManager.eventQueue) { GotItem = false; for (int qc = 0; qc < m_ScriptEngine.m_EventQueueManager.eventQueue.Count; qc++) { // Get queue item QIS = m_ScriptEngine.m_EventQueueManager.eventQueue.Dequeue(); // Check if object is being processed by // someone else if (m_ScriptEngine.m_EventQueueManager.TryLock( QIS.localID) == false) { // Object is already being processed, requeue it m_ScriptEngine.m_EventQueueManager. eventQueue.Enqueue(QIS); } else { // We have lock on an object and can process it GotItem = true; break; } } } if (GotItem == true) { // Execute function try { // Only pipe event if land supports it. if (m_ScriptEngine.World.PipeEventsForScript( QIS.localID)) { lastLocalID = QIS.localID; lastItemID = QIS.itemID; LastExecutionStarted = DateTime.Now.Ticks; KillCurrentScript = false; InExecution = true; m_ScriptEngine.m_ScriptManager.ExecuteEvent( QIS.localID, QIS.itemID, QIS.functionName, QIS.llDetectParams, QIS.param); InExecution = false; } } catch (TargetInvocationException tie) { Exception e = tie.InnerException; if (e is SelfDeleteException) // Forward it throw e; InExecution = false; string text = FormatException(tie, QIS.LineMap); // DISPLAY ERROR INWORLD // if (e.InnerException != null) // { // // Send inner exception // string line = " (unknown line)"; // Regex rx = new Regex(@"SecondLife\.Script\..+[\s:](?<line>\d+)\.?\r?$", RegexOptions.Compiled); // if (rx.Match(e.InnerException.ToString()).Success) // line = " (line " + rx.Match(e.InnerException.ToString()).Result("${line}") + ")"; // text += e.InnerException.Message.ToString() + line; // } // else // { // text += "\r\n"; // // Send normal // text += e.Message.ToString(); // } // if (KillCurrentScript) // text += "\r\nScript will be deactivated!"; try { if (text.Length >= 1100) text = text.Substring(0, 1099); IScriptHost m_host = m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); m_ScriptEngine.World.SimChat( Utils.StringToBytes(text), ChatTypeEnum.DebugChannel, 2147483647, m_host.AbsolutePosition, m_host.Name, m_host.UUID, false); } catch (Exception) { m_log.Error("[" + ScriptEngineName + "]: " + "Unable to send text in-world:\r\n" + text); } finally { // So we are done sending message in-world if (KillCurrentScript) { m_ScriptEngine.m_EventQueueManager. m_ScriptEngine.m_ScriptManager. StopScript( QIS.localID, QIS.itemID); } } } catch (Exception) { throw; } finally { InExecution = false; m_ScriptEngine.m_EventQueueManager.ReleaseLock( QIS.localID); } } } } }
public ScriptManager(ScriptEngine scriptEngine) { m_scriptEngine = scriptEngine; }
public EventQueueManager(ScriptEngine _ScriptEngine) { m_ScriptEngine = _ScriptEngine; ReadConfig(); AdjustNumberOfScriptThreads(); }