aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneManager.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneManager.cs251
1 files changed, 91 insertions, 160 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs
index 1e2e973..0e0b6c3 100644
--- a/OpenSim/Region/Framework/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs
@@ -99,11 +99,12 @@ namespace OpenSim.Region.Framework.Scenes
99 } 99 }
100 } 100 }
101 101
102 private readonly List<Scene> m_localScenes = new List<Scene>(); 102 private readonly DoubleDictionary<UUID, string, Scene> m_localScenes = new DoubleDictionary<UUID, string, Scene>();
103 private Scene m_currentScene = null;
103 104
104 public List<Scene> Scenes 105 public List<Scene> Scenes
105 { 106 {
106 get { return new List<Scene>(m_localScenes); } 107 get { return new List<Scene>(m_localScenes.FindAll(delegate(Scene s) { return true; })); }
107 } 108 }
108 109
109 /// <summary> 110 /// <summary>
@@ -120,13 +121,10 @@ namespace OpenSim.Region.Framework.Scenes
120 { 121 {
121 if (CurrentScene == null) 122 if (CurrentScene == null)
122 { 123 {
123 lock (m_localScenes) 124 List<Scene> sceneList = Scenes;
124 { 125 if (sceneList.Count == 0)
125 if (m_localScenes.Count > 0) 126 return null;
126 return m_localScenes[0]; 127 return sceneList[0];
127 else
128 return null;
129 }
130 } 128 }
131 else 129 else
132 { 130 {
@@ -138,41 +136,35 @@ namespace OpenSim.Region.Framework.Scenes
138 public SceneManager() 136 public SceneManager()
139 { 137 {
140 m_instance = this; 138 m_instance = this;
141 m_localScenes = new List<Scene>(); 139 m_localScenes = new DoubleDictionary<UUID, string, Scene>();
142 } 140 }
143 141
144 public void Close() 142 public void Close()
145 { 143 {
144 List<Scene> localScenes = null;
145
146 lock (m_localScenes) 146 lock (m_localScenes)
147 { 147 {
148 for (int i = 0; i < m_localScenes.Count; i++) 148 localScenes = Scenes;
149 { 149 }
150 m_localScenes[i].Close(); 150
151 } 151 for (int i = 0; i < localScenes.Count; i++)
152 {
153 localScenes[i].Close();
152 } 154 }
153 } 155 }
154 156
155 public void Close(Scene cscene) 157 public void Close(Scene cscene)
156 { 158 {
157 lock (m_localScenes) 159 if (!m_localScenes.ContainsKey(cscene.RegionInfo.RegionID))
158 { 160 return;
159 if (m_localScenes.Contains(cscene)) 161 cscene.Close();
160 {
161 for (int i = 0; i < m_localScenes.Count; i++)
162 {
163 if (m_localScenes[i].Equals(cscene))
164 {
165 m_localScenes[i].Close();
166 }
167 }
168 }
169 }
170 } 162 }
171 163
172 public void Add(Scene scene) 164 public void Add(Scene scene)
173 { 165 {
174 lock (m_localScenes) 166 lock (m_localScenes)
175 m_localScenes.Add(scene); 167 m_localScenes.Add(scene.RegionInfo.RegionID, scene.RegionInfo.RegionName, scene);
176 168
177 scene.OnRestart += HandleRestart; 169 scene.OnRestart += HandleRestart;
178 scene.EventManager.OnRegionReadyStatusChange += HandleRegionReadyStatusChange; 170 scene.EventManager.OnRegionReadyStatusChange += HandleRegionReadyStatusChange;
@@ -184,15 +176,8 @@ namespace OpenSim.Region.Framework.Scenes
184 176
185 lock (m_localScenes) 177 lock (m_localScenes)
186 { 178 {
187 for (int i = 0; i < m_localScenes.Count; i++) 179 m_localScenes.TryGetValue(rdata.RegionID, out restartedScene);
188 { 180 m_localScenes.Remove(rdata.RegionID);
189 if (rdata.RegionName == m_localScenes[i].RegionInfo.RegionName)
190 {
191 restartedScene = m_localScenes[i];
192 m_localScenes.RemoveAt(i);
193 break;
194 }
195 }
196 } 181 }
197 182
198 // If the currently selected scene has been restarted, then we can't reselect here since we the scene 183 // If the currently selected scene has been restarted, then we can't reselect here since we the scene
@@ -207,39 +192,36 @@ namespace OpenSim.Region.Framework.Scenes
207 private void HandleRegionReadyStatusChange(IScene scene) 192 private void HandleRegionReadyStatusChange(IScene scene)
208 { 193 {
209 lock (m_localScenes) 194 lock (m_localScenes)
210 AllRegionsReady = m_localScenes.TrueForAll(s => s.Ready); 195 AllRegionsReady = m_localScenes.FindAll(s => !s.Ready).Count == 0;
211 } 196 }
212 197
213 public void SendSimOnlineNotification(ulong regionHandle) 198 public void SendSimOnlineNotification(ulong regionHandle)
214 { 199 {
215 RegionInfo Result = null; 200 RegionInfo Result = null;
216 201
217 lock (m_localScenes) 202 Scene s = m_localScenes.FindValue(delegate(Scene x)
218 {
219 for (int i = 0; i < m_localScenes.Count; i++)
220 {
221 if (m_localScenes[i].RegionInfo.RegionHandle == regionHandle)
222 { 203 {
223 // Inform other regions to tell their avatar about me 204 if (x.RegionInfo.RegionHandle == regionHandle)
224 Result = m_localScenes[i].RegionInfo; 205 return true;
225 } 206 return false;
226 } 207 });
208
209 if (s != null)
210 {
211 List<Scene> sceneList = Scenes;
227 212
228 if (Result != null) 213 for (int i = 0; i < sceneList.Count; i++)
229 { 214 {
230 for (int i = 0; i < m_localScenes.Count; i++) 215 if (sceneList[i]!= s)
231 { 216 {
232 if (m_localScenes[i].RegionInfo.RegionHandle != regionHandle) 217 // Inform other regions to tell their avatar about me
233 { 218 //sceneList[i].OtherRegionUp(Result);
234 // Inform other regions to tell their avatar about me
235 //m_localScenes[i].OtherRegionUp(Result);
236 }
237 } 219 }
238 } 220 }
239 else 221 }
240 { 222 else
241 m_log.Error("[REGION]: Unable to notify Other regions of this Region coming up"); 223 {
242 } 224 m_log.Error("[REGION]: Unable to notify Other regions of this Region coming up");
243 } 225 }
244 } 226 }
245 227
@@ -343,8 +325,8 @@ namespace OpenSim.Region.Framework.Scenes
343 { 325 {
344 if (CurrentScene == null) 326 if (CurrentScene == null)
345 { 327 {
346 lock (m_localScenes) 328 List<Scene> sceneList = Scenes;
347 m_localScenes.ForEach(func); 329 sceneList.ForEach(func);
348 } 330 }
349 else 331 else
350 { 332 {
@@ -373,16 +355,12 @@ namespace OpenSim.Region.Framework.Scenes
373 } 355 }
374 else 356 else
375 { 357 {
376 lock (m_localScenes) 358 Scene s;
359
360 if (m_localScenes.TryGetValue(regionName, out s))
377 { 361 {
378 foreach (Scene scene in m_localScenes) 362 m_currentScene = s;
379 { 363 return true;
380 if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0)
381 {
382 CurrentScene = scene;
383 return true;
384 }
385 }
386 } 364 }
387 365
388 return false; 366 return false;
@@ -391,18 +369,14 @@ namespace OpenSim.Region.Framework.Scenes
391 369
392 public bool TrySetCurrentScene(UUID regionID) 370 public bool TrySetCurrentScene(UUID regionID)
393 { 371 {
394 m_log.Debug("Searching for Region: '" + regionID + "'"); 372// m_log.Debug("Searching for Region: '" + regionID + "'");
395 373
396 lock (m_localScenes) 374 Scene s;
375
376 if (m_localScenes.TryGetValue(regionID, out s))
397 { 377 {
398 foreach (Scene scene in m_localScenes) 378 m_currentScene = s;
399 { 379 return true;
400 if (scene.RegionInfo.RegionID == regionID)
401 {
402 CurrentScene = scene;
403 return true;
404 }
405 }
406 } 380 }
407 381
408 return false; 382 return false;
@@ -410,52 +384,24 @@ namespace OpenSim.Region.Framework.Scenes
410 384
411 public bool TryGetScene(string regionName, out Scene scene) 385 public bool TryGetScene(string regionName, out Scene scene)
412 { 386 {
413 lock (m_localScenes) 387 return m_localScenes.TryGetValue(regionName, out scene);
414 {
415 foreach (Scene mscene in m_localScenes)
416 {
417 if (String.Compare(mscene.RegionInfo.RegionName, regionName, true) == 0)
418 {
419 scene = mscene;
420 return true;
421 }
422 }
423 }
424
425 scene = null;
426 return false;
427 } 388 }
428 389
429 public bool TryGetScene(UUID regionID, out Scene scene) 390 public bool TryGetScene(UUID regionID, out Scene scene)
430 { 391 {
431 lock (m_localScenes) 392 return m_localScenes.TryGetValue(regionID, out scene);
432 {
433 foreach (Scene mscene in m_localScenes)
434 {
435 if (mscene.RegionInfo.RegionID == regionID)
436 {
437 scene = mscene;
438 return true;
439 }
440 }
441 }
442
443 scene = null;
444 return false;
445 } 393 }
446 394
447 public bool TryGetScene(uint locX, uint locY, out Scene scene) 395 public bool TryGetScene(uint locX, uint locY, out Scene scene)
448 { 396 {
449 lock (m_localScenes) 397 List<Scene> sceneList = Scenes;
398 foreach (Scene mscene in sceneList)
450 { 399 {
451 foreach (Scene mscene in m_localScenes) 400 if (mscene.RegionInfo.RegionLocX == locX &&
401 mscene.RegionInfo.RegionLocY == locY)
452 { 402 {
453 if (mscene.RegionInfo.RegionLocX == locX && 403 scene = mscene;
454 mscene.RegionInfo.RegionLocY == locY) 404 return true;
455 {
456 scene = mscene;
457 return true;
458 }
459 } 405 }
460 } 406 }
461 407
@@ -465,16 +411,14 @@ namespace OpenSim.Region.Framework.Scenes
465 411
466 public bool TryGetScene(IPEndPoint ipEndPoint, out Scene scene) 412 public bool TryGetScene(IPEndPoint ipEndPoint, out Scene scene)
467 { 413 {
468 lock (m_localScenes) 414 List<Scene> sceneList = Scenes;
415 foreach (Scene mscene in sceneList)
469 { 416 {
470 foreach (Scene mscene in m_localScenes) 417 if ((mscene.RegionInfo.InternalEndPoint.Equals(ipEndPoint.Address)) &&
418 (mscene.RegionInfo.InternalEndPoint.Port == ipEndPoint.Port))
471 { 419 {
472 if ((mscene.RegionInfo.InternalEndPoint.Equals(ipEndPoint.Address)) && 420 scene = mscene;
473 (mscene.RegionInfo.InternalEndPoint.Port == ipEndPoint.Port)) 421 return true;
474 {
475 scene = mscene;
476 return true;
477 }
478 } 422 }
479 } 423 }
480 424
@@ -539,15 +483,10 @@ namespace OpenSim.Region.Framework.Scenes
539 483
540 public RegionInfo GetRegionInfo(UUID regionID) 484 public RegionInfo GetRegionInfo(UUID regionID)
541 { 485 {
542 lock (m_localScenes) 486 Scene s;
487 if (m_localScenes.TryGetValue(regionID, out s))
543 { 488 {
544 foreach (Scene scene in m_localScenes) 489 return s.RegionInfo;
545 {
546 if (scene.RegionInfo.RegionID == regionID)
547 {
548 return scene.RegionInfo;
549 }
550 }
551 } 490 }
552 491
553 return null; 492 return null;
@@ -565,14 +504,12 @@ namespace OpenSim.Region.Framework.Scenes
565 504
566 public bool TryGetScenePresence(UUID avatarId, out ScenePresence avatar) 505 public bool TryGetScenePresence(UUID avatarId, out ScenePresence avatar)
567 { 506 {
568 lock (m_localScenes) 507 List<Scene> sceneList = Scenes;
508 foreach (Scene scene in sceneList)
569 { 509 {
570 foreach (Scene scene in m_localScenes) 510 if (scene.TryGetScenePresence(avatarId, out avatar))
571 { 511 {
572 if (scene.TryGetScenePresence(avatarId, out avatar)) 512 return true;
573 {
574 return true;
575 }
576 } 513 }
577 } 514 }
578 515
@@ -582,15 +519,13 @@ namespace OpenSim.Region.Framework.Scenes
582 519
583 public bool TryGetRootScenePresence(UUID avatarId, out ScenePresence avatar) 520 public bool TryGetRootScenePresence(UUID avatarId, out ScenePresence avatar)
584 { 521 {
585 lock (m_localScenes) 522 List<Scene> sceneList = Scenes;
523 foreach (Scene scene in sceneList)
586 { 524 {
587 foreach (Scene scene in m_localScenes) 525 avatar = scene.GetScenePresence(avatarId);
588 {
589 avatar = scene.GetScenePresence(avatarId);
590 526
591 if (avatar != null && !avatar.IsChildAgent) 527 if (avatar != null && !avatar.IsChildAgent)
592 return true; 528 return true;
593 }
594 } 529 }
595 530
596 avatar = null; 531 avatar = null;
@@ -600,21 +535,19 @@ namespace OpenSim.Region.Framework.Scenes
600 public void CloseScene(Scene scene) 535 public void CloseScene(Scene scene)
601 { 536 {
602 lock (m_localScenes) 537 lock (m_localScenes)
603 m_localScenes.Remove(scene); 538 m_localScenes.Remove(scene.RegionInfo.RegionID);
604 539
605 scene.Close(); 540 scene.Close();
606 } 541 }
607 542
608 public bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) 543 public bool TryGetAvatarByName(string avatarName, out ScenePresence avatar)
609 { 544 {
610 lock (m_localScenes) 545 List<Scene> sceneList = Scenes;
546 foreach (Scene scene in sceneList)
611 { 547 {
612 foreach (Scene scene in m_localScenes) 548 if (scene.TryGetAvatarByName(avatarName, out avatar))
613 { 549 {
614 if (scene.TryGetAvatarByName(avatarName, out avatar)) 550 return true;
615 {
616 return true;
617 }
618 } 551 }
619 } 552 }
620 553
@@ -624,14 +557,12 @@ namespace OpenSim.Region.Framework.Scenes
624 557
625 public bool TryGetRootScenePresenceByName(string firstName, string lastName, out ScenePresence sp) 558 public bool TryGetRootScenePresenceByName(string firstName, string lastName, out ScenePresence sp)
626 { 559 {
627 lock (m_localScenes) 560 List<Scene> sceneList = Scenes;
561 foreach (Scene scene in sceneList)
628 { 562 {
629 foreach (Scene scene in m_localScenes) 563 sp = scene.GetScenePresence(firstName, lastName);
630 { 564 if (sp != null && !sp.IsChildAgent)
631 sp = scene.GetScenePresence(firstName, lastName); 565 return true;
632 if (sp != null && !sp.IsChildAgent)
633 return true;
634 }
635 } 566 }
636 567
637 sp = null; 568 sp = null;
@@ -640,8 +571,8 @@ namespace OpenSim.Region.Framework.Scenes
640 571
641 public void ForEachScene(Action<Scene> action) 572 public void ForEachScene(Action<Scene> action)
642 { 573 {
643 lock (m_localScenes) 574 List<Scene> sceneList = Scenes;
644 m_localScenes.ForEach(action); 575 sceneList.ForEach(action);
645 } 576 }
646 } 577 }
647} 578}