public EventManager(ScriptEngine _ScriptEngine, bool performHookUp)
        {
            myScriptEngine = _ScriptEngine;
            ReadConfig();

            if (performHookUp)
            {
                myScriptEngine.World.EventManager.OnRezScript += OnRezScript;
            }
        }
示例#2
0
 //public AppDomainManager(ScriptEngine scriptEngine)
 public AppDomainManager(ScriptEngine scriptEngine)
 {
     m_scriptEngine = scriptEngine;
     ReadConfig();
 }
示例#3
0
        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);
                        }
                    }
                }
            }
        }
示例#4
0
 public ScriptManager(ScriptEngine scriptEngine)
 {
     m_scriptEngine = scriptEngine;
 }
示例#5
0
        public EventQueueManager(ScriptEngine _ScriptEngine)
        {
            m_ScriptEngine = _ScriptEngine;

            ReadConfig();
            AdjustNumberOfScriptThreads();
        }