Пример #1
0
        void IAgentListener.RemovedAgent(IAgent agent)
        {
            IPhysicsObject physobj;

            m_Agents.Remove(agent);
            agent.PhysicsActors.Remove(m_SceneID, out physobj);
        }
Пример #2
0
        public void HandleObjectDeselect(Message m)
        {
            var req = (ObjectDeselect)m;

            if (req.CircuitSessionID != req.SessionID ||
                req.CircuitAgentID != req.AgentID)
            {
                return;
            }
            IAgent agent;

            if (!Agents.TryGetValue(req.AgentID, out agent))
            {
                return;
            }

            ObjectPart          part;
            RwLockedList <UUID> selectedObjects = agent.SelectedObjects(ID);

            foreach (uint primLocalID in req.ObjectData)
            {
#if DEBUG
                m_Log.DebugFormat("ObjectDeselect localid={0}", primLocalID);
#endif
                if (!Primitives.TryGetValue(primLocalID, out part))
                {
                    continue;
                }

                selectedObjects.Remove(part.ID);
                agent.ScheduleUpdate(part.UpdateInfo, ID);
            }
        }
Пример #3
0
        protected internal void Remove(Listener listener)
        {
            ChannelInfo channel;

            if (m_Channels.TryGetValue(listener.Channel, out channel))
            {
                channel.Listeners.Remove(listener);
                m_Channels.RemoveIf(listener.Channel, (ChannelInfo ch) => ch.Listeners.Count == 0);
            }
            m_ChatPass.Remove(listener);
        }
Пример #4
0
        private void UpdateGodAgentsList(RwLockedList <UGUI> list, UUID regionId, string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                list.Clear();
            }
            else
            {
                string[] god_agents_list = value.Split(new char[] { ',' });
                var      new_gods        = new List <UGUI>();
                foreach (string god_agent in god_agents_list)
                {
                    UGUI uui;
                    try
                    {
                        uui = new UGUI(god_agent);
                    }
                    catch
                    {
                        m_Log.WarnFormat("Invalid UUI '{1}' found in {0}/god_agents variable", regionId.ToString(), god_agent);
                        continue;
                    }
                    new_gods.Add(uui);
                }

                foreach (UGUI god in new List <UGUI>(list))
                {
                    if (!new_gods.Contains(god))
                    {
                        list.Remove(god);
                    }
                }

                foreach (UGUI god in new_gods)
                {
                    if (!list.Contains(god))
                    {
                        list.Add(god);
                    }
                }
            }
        }
Пример #5
0
 public void RegionRemoved(SceneInterface scene)
 {
     scene.GridService.UnregisterRegion(scene.ID);
     m_RegisteredScenes.Remove(scene);
 }
Пример #6
0
            protected override void StorageTerrainThread()
            {
                try
                {
                    m_TerrainListenerThreads.Add(this);
                    Thread.CurrentThread.Name = "Storage Terrain Thread: " + RegionID.ToString();

                    var    knownSerialNumbers = new C5.TreeDictionary <uint, uint>();
                    string replaceIntoTerrain = string.Empty;
                    var    updateRequests     = new List <string>();

                    while (!m_StopStorageThread || m_StorageTerrainRequestQueue.Count != 0)
                    {
                        LayerPatch req;
                        try
                        {
                            req = m_StorageTerrainRequestQueue.Dequeue(1000);
                        }
                        catch
                        {
                            continue;
                        }

                        uint serialNumber = req.Serial;

                        if (!knownSerialNumbers.Contains(req.ExtendedPatchID) || knownSerialNumbers[req.ExtendedPatchID] != req.Serial)
                        {
                            var data = new Dictionary <string, object>
                            {
                                ["RegionID"]    = RegionID,
                                ["PatchID"]     = req.ExtendedPatchID,
                                ["TerrainData"] = req.Serialization
                            };
                            if (replaceIntoTerrain.Length == 0)
                            {
                                replaceIntoTerrain = "REPLACE INTO terrains (" + MySQLUtilities.GenerateFieldNames(data) + ") VALUES ";
                            }
                            updateRequests.Add("(" + MySQLUtilities.GenerateValues(data) + ")");
                            knownSerialNumbers[req.ExtendedPatchID] = serialNumber;
                        }

                        if ((m_StorageTerrainRequestQueue.Count == 0 && updateRequests.Count > 0) || updateRequests.Count >= 256)
                        {
                            string elems = string.Join(",", updateRequests);
                            try
                            {
                                using (var conn = new MySqlConnection(m_ConnectionString))
                                {
                                    conn.Open();
                                    using (var cmd = new MySqlCommand(replaceIntoTerrain + elems, conn))
                                    {
                                        cmd.ExecuteNonQuery();
                                    }
                                }
                                updateRequests.Clear();
                                Interlocked.Increment(ref m_ProcessedPatches);
                            }
                            catch (Exception e)
                            {
                                m_Log.Error("Terrain store failed", e);
                            }
                        }
                    }
                }
                finally
                {
                    m_TerrainListenerThreads.Remove(this);
                }
            }
            protected override void StorageTerrainThread()
            {
                try
                {
                    m_TerrainListenerThreads.Add(this);
                    Thread.CurrentThread.Name = "Storage Terrain Thread: " + RegionID.ToString();

                    var knownSerialNumbers = new C5.TreeDictionary <uint, uint>();
                    Dictionary <string, object> updateRequestData = new Dictionary <string, object>();
                    int updateRequestCount = 0;

                    while (!m_StopStorageThread || m_StorageTerrainRequestQueue.Count != 0)
                    {
                        LayerPatch req;
                        try
                        {
                            req = m_StorageTerrainRequestQueue.Dequeue(1000);
                        }
                        catch
                        {
                            continue;
                        }

                        if (req == null)
                        {
                            using (var connection = new NpgsqlConnection(m_ConnectionString))
                            {
                                connection.Open();
                                connection.InsideTransaction((transaction) =>
                                {
                                    using (var cmd = new NpgsqlCommand("DELETE FROM defaultterrains WHERE RegionID=@regionid", connection)
                                    {
                                        Transaction = transaction
                                    })
                                    {
                                        cmd.Parameters.AddParameter("@RegionID", RegionID);
                                        cmd.ExecuteNonQuery();
                                    }
                                    using (var cmd = new NpgsqlCommand("INSERT INTO defaultterrains (RegionID, PatchID, TerrainData) SELECT RegionID, PatchID, TerrainData FROM terrains WHERE RegionID=@regionid", connection)
                                    {
                                        Transaction = transaction
                                    })
                                    {
                                        cmd.Parameters.AddParameter("@RegionID", RegionID);
                                        cmd.ExecuteNonQuery();
                                    }
                                });
                            }
                        }
                        else
                        {
                            uint serialNumber = req.Serial;

                            if (!knownSerialNumbers.Contains(req.ExtendedPatchID) || knownSerialNumbers[req.ExtendedPatchID] != req.Serial)
                            {
                                updateRequestData.Add("PatchID" + updateRequestCount, req.ExtendedPatchID);
                                updateRequestData.Add("TerrainData" + updateRequestCount, req.Serialization);
                                ++updateRequestCount;
                                knownSerialNumbers[req.ExtendedPatchID] = serialNumber;
                            }

                            if ((m_StorageTerrainRequestQueue.Count == 0 && updateRequestCount > 0) || updateRequestCount >= 256)
                            {
                                StringBuilder updateCmd = new StringBuilder();
                                try
                                {
                                    using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
                                    {
                                        conn.Open();
                                        if (conn.HasOnConflict() && m_EnableOnConflict)
                                        {
                                            for (int i = 0; i < updateRequestCount; ++i)
                                            {
                                                updateCmd.AppendFormat("INSERT INTO terrains (\"RegionID\", \"PatchID\", \"TerrainData\") VALUES (@regionid, @patchid{0}, @terraindata{0}) ON CONFLICT(\"RegionID\", \"PatchID\") DO UPDATE SET \"TerrainData\"= @terraindata{0};", i);
                                            }
                                        }
                                        else
                                        {
                                            for (int i = 0; i < updateRequestCount; ++i)
                                            {
                                                updateCmd.AppendFormat("UPDATE terrains SET \"TerrainData\"=@terraindata{0} WHERE \"RegionID\" = @regionid AND \"PatchID\" = @patchid{0};", i);
                                                updateCmd.AppendFormat("INSERT INTO terrains (\"RegionID\", \"PatchID\", \"TerrainData\") SELECT @regionid, @patchid{0}, @terraindata{0} WHERE NOT EXISTS " +
                                                                       "(SELECT 1 FROM terrains WHERE \"RegionID\" = @regionid AND \"PatchID\" = @patchid{0});", i);
                                            }
                                        }
                                        using (NpgsqlCommand cmd = new NpgsqlCommand(updateCmd.ToString(), conn))
                                        {
                                            cmd.Parameters.AddParameter("@regionid", RegionID);
                                            foreach (KeyValuePair <string, object> kvp in updateRequestData)
                                            {
                                                cmd.Parameters.AddParameter(kvp.Key, kvp.Value);
                                            }
                                            cmd.ExecuteNonQuery();
                                        }
                                    }
                                    updateRequestData.Clear();
                                    updateRequestCount = 0;
                                    Interlocked.Increment(ref m_ProcessedPatches);
                                }
                                catch (Exception e)
                                {
                                    m_Log.Error("Terrain store failed", e);
                                }
                            }
                        }
                    }
                }
                finally
                {
                    m_TerrainListenerThreads.Remove(this);
                }
            }
Пример #8
0
 protected override void OnStop()
 {
     m_SceneListenerThreads.Remove(this);
 }
        private void ThreadMain(object obj)
        {
            var            tc   = (ScriptThreadContext)obj;
            var            pool = tc.ThreadPool;
            ScriptInstance ev;

            while (!m_ShutdownThreads)
            {
                try
                {
                    ev = pool.m_ScriptTriggerQueue.Dequeue(1000);
                }
                catch
                {
                    lock (m_Threads)
                    {
                        if (m_Threads.Count > m_MinimumThreads)
                        {
                            break;
                        }
                    }
                    continue;
                }

                long executionStart = TimeSource.TickCount;
                tc.ExecutionStartTickCount = executionStart;
                tc.IsExecuting             = true;
                ObjectPartInventoryItem item = ev.Item;
                try
                {
                    Interlocked.Increment(ref m_ExecutingScripts);
                    lock (tc)
                    {
                        if (Interlocked.CompareExchange(ref ev.ThreadPool, this, null) != null)
                        {
                            continue;
                        }
                        tc.CurrentScriptInstance = ev;
                    }
                    ev.ProcessEvent();
                }
                catch (ThreadAbortException)
                {
                    /* no in script event should abort us */
                    Thread.ResetAbort();
                    try
                    {
                        item.ScriptInstance = null;
                    }
                    catch (ThreadAbortException)
                    {
                        Thread.ResetAbort();
                    }
                    catch (Exception e)
                    {
                        m_Log.WarnFormat("Exception at script removal {0} ({1}): {2}\n{3}",
                                         item.Name, item.AssetID.ToString(),
                                         e.Message,
                                         e.StackTrace);
                    }
                    ScriptLoader.Remove(item.AssetID, ev);
                    continue;
                }
                catch (ScriptAbortException)
                {
                    ev.AbortBegin();
                    try
                    {
                        item.ScriptInstance = null;
                    }
                    catch (ThreadAbortException)
                    {
                        Thread.ResetAbort();
                    }
                    catch (Exception e)
                    {
                        m_Log.WarnFormat("Exception at script removal {0} ({1}): {2}\n{3}",
                                         item.Name, item.AssetID.ToString(),
                                         e.Message,
                                         e.StackTrace);
                    }
                    ScriptLoader.Remove(item.AssetID, ev);
                    continue;
                }
                catch (InvalidProgramException e)
                {
                    /* stop the broken script */
                    m_Log.WarnFormat("Automatically stopped script {0} ({1}) of {2} ({3}) in {4} ({5}) due to program error: {6}\n{7}",
                                     item.Name, item.AssetID.ToString(),
                                     ev.Part?.Name ?? "?", ev.Part?.ID.ToString() ?? "?",
                                     ev.Part?.ObjectGroup?.Name ?? "?", ev.Part?.ObjectGroup?.ID.ToString() ?? "?",
                                     e.Message,
                                     e.StackTrace);
                    ev.IsRunning = false;
                    continue;
                }
                catch (Exception e)
                {
                    m_Log.WarnFormat("Exception at script {0} ({1}) of {2} ({3}) in {4} ({5}) due to program error: {6}\n{7}",
                                     item.Name, item.AssetID.ToString(),
                                     ev.Part?.Name ?? "?", ev.Part?.ID.ToString() ?? "?",
                                     ev.Part?.ObjectGroup?.Name, ev.Part?.ObjectGroup?.ID.ToString() ?? "?",
                                     e.Message,
                                     e.StackTrace);
                }
                finally
                {
                    Interlocked.Decrement(ref m_ExecutingScripts);
                    tc.IsExecuting = false;
                    uint localId;
                    lock (tc)
                    {
                        try
                        {
                            localId        = tc.CurrentScriptInstance.Part.LocalID[m_SceneID];
                            executionStart = TimeSource.TicksElapsed(TimeSource.TickCount, executionStart);
                            if (executionStart > 0)
                            {
                                RwLockedDictionary <uint, ScriptReportData> execTime = m_TopScripts;
                                ScriptReportData prevexectime;
                                if (!execTime.TryGetValue(localId, out prevexectime))
                                {
                                    prevexectime = new ScriptReportData();
                                    execTime.Add(localId, prevexectime);
                                }
                                prevexectime.AddScore(TimeSource.TicksToMsecs(executionStart));
                                Interlocked.Add(ref m_ScriptRuntimeAccumulatingTickCount, executionStart);
                            }
                        }
                        catch
                        {
                            /* ignore it here */
                        }
                        tc.CurrentScriptInstance = null;
                    }
                }

                ev.ThreadPool = null;
                if (ev.HasEventsPending)
                {
                    pool.m_ScriptTriggerQueue.Enqueue(ev);
                }
            }

            lock (m_Threads)
            {
                m_Threads.Remove(tc);
                if (m_ShutdownThreads && m_Threads.Count == 0)
                {
                    m_WaitShutdownEvent.Set();
                }
            }
        }