diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneManager.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneManager.cs | 251 |
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 | } |