void IAgentListener.RemovedAgent(IAgent agent) { IPhysicsObject physobj; m_Agents.Remove(agent); agent.PhysicsActors.Remove(m_SceneID, out physobj); }
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); } }
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); }
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); } } } }
public void RegionRemoved(SceneInterface scene) { scene.GridService.UnregisterRegion(scene.ID); m_RegisteredScenes.Remove(scene); }
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); } }
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(); } } }