aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneManager.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2011-08-06 01:15:49 +0100
committerJustin Clark-Casey (justincc)2011-08-06 01:15:49 +0100
commit76f46b25454c0c9376130a59cc1b766c0d105dd0 (patch)
tree549495272eb759fb8f90027230888fce2ff0d714 /OpenSim/Region/Framework/Scenes/SceneManager.cs
parentrename TestHelper => TestHelpers for consistency (diff)
downloadopensim-SC-76f46b25454c0c9376130a59cc1b766c0d105dd0.zip
opensim-SC-76f46b25454c0c9376130a59cc1b766c0d105dd0.tar.gz
opensim-SC-76f46b25454c0c9376130a59cc1b766c0d105dd0.tar.bz2
opensim-SC-76f46b25454c0c9376130a59cc1b766c0d105dd0.tar.xz
Do proper locking of m_localScenes list in SceneManager
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneManager.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneManager.cs233
1 files changed, 140 insertions, 93 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs
index 86ba2aa..069367d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs
@@ -47,12 +47,12 @@ namespace OpenSim.Region.Framework.Scenes
47 47
48 public event RestartSim OnRestartSim; 48 public event RestartSim OnRestartSim;
49 49
50 private readonly List<Scene> m_localScenes; 50 private readonly List<Scene> m_localScenes = new List<Scene>();
51 private Scene m_currentScene = null; 51 private Scene m_currentScene = null;
52 52
53 public List<Scene> Scenes 53 public List<Scene> Scenes
54 { 54 {
55 get { return m_localScenes; } 55 get { return new List<Scene>(m_localScenes); }
56 } 56 }
57 57
58 public Scene CurrentScene 58 public Scene CurrentScene
@@ -66,13 +66,12 @@ namespace OpenSim.Region.Framework.Scenes
66 { 66 {
67 if (m_currentScene == null) 67 if (m_currentScene == null)
68 { 68 {
69 if (m_localScenes.Count > 0) 69 lock (m_localScenes)
70 { 70 {
71 return m_localScenes[0]; 71 if (m_localScenes.Count > 0)
72 } 72 return m_localScenes[0];
73 else 73 else
74 { 74 return null;
75 return null;
76 } 75 }
77 } 76 }
78 else 77 else
@@ -82,26 +81,25 @@ namespace OpenSim.Region.Framework.Scenes
82 } 81 }
83 } 82 }
84 83
85 public SceneManager()
86 {
87 m_localScenes = new List<Scene>();
88 }
89
90 public void Close() 84 public void Close()
91 { 85 {
92 // collect known shared modules in sharedModules 86 // collect known shared modules in sharedModules
93 Dictionary<string, IRegionModule> sharedModules = new Dictionary<string, IRegionModule>(); 87 Dictionary<string, IRegionModule> sharedModules = new Dictionary<string, IRegionModule>();
94 for (int i = 0; i < m_localScenes.Count; i++) 88
89 lock (m_localScenes)
95 { 90 {
96 // extract known shared modules from scene 91 for (int i = 0; i < m_localScenes.Count; i++)
97 foreach (string k in m_localScenes[i].Modules.Keys)
98 { 92 {
99 if (m_localScenes[i].Modules[k].IsSharedModule && 93 // extract known shared modules from scene
100 !sharedModules.ContainsKey(k)) 94 foreach (string k in m_localScenes[i].Modules.Keys)
101 sharedModules[k] = m_localScenes[i].Modules[k]; 95 {
96 if (m_localScenes[i].Modules[k].IsSharedModule &&
97 !sharedModules.ContainsKey(k))
98 sharedModules[k] = m_localScenes[i].Modules[k];
99 }
100 // close scene/region
101 m_localScenes[i].Close();
102 } 102 }
103 // close scene/region
104 m_localScenes[i].Close();
105 } 103 }
106 104
107 // all regions/scenes are now closed, we can now safely 105 // all regions/scenes are now closed, we can now safely
@@ -114,13 +112,16 @@ namespace OpenSim.Region.Framework.Scenes
114 112
115 public void Close(Scene cscene) 113 public void Close(Scene cscene)
116 { 114 {
117 if (m_localScenes.Contains(cscene)) 115 lock (m_localScenes)
118 { 116 {
119 for (int i = 0; i < m_localScenes.Count; i++) 117 if (m_localScenes.Contains(cscene))
120 { 118 {
121 if (m_localScenes[i].Equals(cscene)) 119 for (int i = 0; i < m_localScenes.Count; i++)
122 { 120 {
123 m_localScenes[i].Close(); 121 if (m_localScenes[i].Equals(cscene))
122 {
123 m_localScenes[i].Close();
124 }
124 } 125 }
125 } 126 }
126 } 127 }
@@ -129,27 +130,33 @@ namespace OpenSim.Region.Framework.Scenes
129 public void Add(Scene scene) 130 public void Add(Scene scene)
130 { 131 {
131 scene.OnRestart += HandleRestart; 132 scene.OnRestart += HandleRestart;
132 m_localScenes.Add(scene); 133
134 lock (m_localScenes)
135 m_localScenes.Add(scene);
133 } 136 }
134 137
135 public void HandleRestart(RegionInfo rdata) 138 public void HandleRestart(RegionInfo rdata)
136 { 139 {
137 m_log.Error("[SCENEMANAGER]: Got Restart message for region:" + rdata.RegionName + " Sending up to main"); 140 m_log.Error("[SCENEMANAGER]: Got Restart message for region:" + rdata.RegionName + " Sending up to main");
138 int RegionSceneElement = -1; 141 int RegionSceneElement = -1;
139 for (int i = 0; i < m_localScenes.Count; i++) 142
143 lock (m_localScenes)
140 { 144 {
141 if (rdata.RegionName == m_localScenes[i].RegionInfo.RegionName) 145 for (int i = 0; i < m_localScenes.Count; i++)
142 { 146 {
143 RegionSceneElement = i; 147 if (rdata.RegionName == m_localScenes[i].RegionInfo.RegionName)
148 {
149 RegionSceneElement = i;
150 }
144 } 151 }
145 }
146 152
147 // Now we make sure the region is no longer known about by the SceneManager 153 // Now we make sure the region is no longer known about by the SceneManager
148 // Prevents duplicates. 154 // Prevents duplicates.
149 155
150 if (RegionSceneElement >= 0) 156 if (RegionSceneElement >= 0)
151 { 157 {
152 m_localScenes.RemoveAt(RegionSceneElement); 158 m_localScenes.RemoveAt(RegionSceneElement);
159 }
153 } 160 }
154 161
155 // Send signal to main that we're restarting this sim. 162 // Send signal to main that we're restarting this sim.
@@ -160,28 +167,32 @@ namespace OpenSim.Region.Framework.Scenes
160 { 167 {
161 RegionInfo Result = null; 168 RegionInfo Result = null;
162 169
163 for (int i = 0; i < m_localScenes.Count; i++) 170 lock (m_localScenes)
164 {
165 if (m_localScenes[i].RegionInfo.RegionHandle == regionHandle)
166 {
167 // Inform other regions to tell their avatar about me
168 Result = m_localScenes[i].RegionInfo;
169 }
170 }
171 if (Result != null)
172 { 171 {
173 for (int i = 0; i < m_localScenes.Count; i++) 172 for (int i = 0; i < m_localScenes.Count; i++)
174 { 173 {
175 if (m_localScenes[i].RegionInfo.RegionHandle != regionHandle) 174 if (m_localScenes[i].RegionInfo.RegionHandle == regionHandle)
176 { 175 {
177 // Inform other regions to tell their avatar about me 176 // Inform other regions to tell their avatar about me
178 //m_localScenes[i].OtherRegionUp(Result); 177 Result = m_localScenes[i].RegionInfo;
179 } 178 }
180 } 179 }
181 } 180
182 else 181 if (Result != null)
183 { 182 {
184 m_log.Error("[REGION]: Unable to notify Other regions of this Region coming up"); 183 for (int i = 0; i < m_localScenes.Count; i++)
184 {
185 if (m_localScenes[i].RegionInfo.RegionHandle != regionHandle)
186 {
187 // Inform other regions to tell their avatar about me
188 //m_localScenes[i].OtherRegionUp(Result);
189 }
190 }
191 }
192 else
193 {
194 m_log.Error("[REGION]: Unable to notify Other regions of this Region coming up");
195 }
185 } 196 }
186 } 197 }
187 198
@@ -285,7 +296,8 @@ namespace OpenSim.Region.Framework.Scenes
285 { 296 {
286 if (m_currentScene == null) 297 if (m_currentScene == null)
287 { 298 {
288 m_localScenes.ForEach(func); 299 lock (m_localScenes)
300 m_localScenes.ForEach(func);
289 } 301 }
290 else 302 else
291 { 303 {
@@ -314,12 +326,15 @@ namespace OpenSim.Region.Framework.Scenes
314 } 326 }
315 else 327 else
316 { 328 {
317 foreach (Scene scene in m_localScenes) 329 lock (m_localScenes)
318 { 330 {
319 if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0) 331 foreach (Scene scene in m_localScenes)
320 { 332 {
321 m_currentScene = scene; 333 if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0)
322 return true; 334 {
335 m_currentScene = scene;
336 return true;
337 }
323 } 338 }
324 } 339 }
325 340
@@ -331,12 +346,15 @@ namespace OpenSim.Region.Framework.Scenes
331 { 346 {
332 m_log.Debug("Searching for Region: '" + regionID + "'"); 347 m_log.Debug("Searching for Region: '" + regionID + "'");
333 348
334 foreach (Scene scene in m_localScenes) 349 lock (m_localScenes)
335 { 350 {
336 if (scene.RegionInfo.RegionID == regionID) 351 foreach (Scene scene in m_localScenes)
337 { 352 {
338 m_currentScene = scene; 353 if (scene.RegionInfo.RegionID == regionID)
339 return true; 354 {
355 m_currentScene = scene;
356 return true;
357 }
340 } 358 }
341 } 359 }
342 360
@@ -345,26 +363,33 @@ namespace OpenSim.Region.Framework.Scenes
345 363
346 public bool TryGetScene(string regionName, out Scene scene) 364 public bool TryGetScene(string regionName, out Scene scene)
347 { 365 {
348 foreach (Scene mscene in m_localScenes) 366 lock (m_localScenes)
349 { 367 {
350 if (String.Compare(mscene.RegionInfo.RegionName, regionName, true) == 0) 368 foreach (Scene mscene in m_localScenes)
351 { 369 {
352 scene = mscene; 370 if (String.Compare(mscene.RegionInfo.RegionName, regionName, true) == 0)
353 return true; 371 {
372 scene = mscene;
373 return true;
374 }
354 } 375 }
355 } 376 }
377
356 scene = null; 378 scene = null;
357 return false; 379 return false;
358 } 380 }
359 381
360 public bool TryGetScene(UUID regionID, out Scene scene) 382 public bool TryGetScene(UUID regionID, out Scene scene)
361 { 383 {
362 foreach (Scene mscene in m_localScenes) 384 lock (m_localScenes)
363 { 385 {
364 if (mscene.RegionInfo.RegionID == regionID) 386 foreach (Scene mscene in m_localScenes)
365 { 387 {
366 scene = mscene; 388 if (mscene.RegionInfo.RegionID == regionID)
367 return true; 389 {
390 scene = mscene;
391 return true;
392 }
368 } 393 }
369 } 394 }
370 395
@@ -374,13 +399,16 @@ namespace OpenSim.Region.Framework.Scenes
374 399
375 public bool TryGetScene(uint locX, uint locY, out Scene scene) 400 public bool TryGetScene(uint locX, uint locY, out Scene scene)
376 { 401 {
377 foreach (Scene mscene in m_localScenes) 402 lock (m_localScenes)
378 { 403 {
379 if (mscene.RegionInfo.RegionLocX == locX && 404 foreach (Scene mscene in m_localScenes)
380 mscene.RegionInfo.RegionLocY == locY)
381 { 405 {
382 scene = mscene; 406 if (mscene.RegionInfo.RegionLocX == locX &&
383 return true; 407 mscene.RegionInfo.RegionLocY == locY)
408 {
409 scene = mscene;
410 return true;
411 }
384 } 412 }
385 } 413 }
386 414
@@ -390,13 +418,16 @@ namespace OpenSim.Region.Framework.Scenes
390 418
391 public bool TryGetScene(IPEndPoint ipEndPoint, out Scene scene) 419 public bool TryGetScene(IPEndPoint ipEndPoint, out Scene scene)
392 { 420 {
393 foreach (Scene mscene in m_localScenes) 421 lock (m_localScenes)
394 { 422 {
395 if ((mscene.RegionInfo.InternalEndPoint.Equals(ipEndPoint.Address)) && 423 foreach (Scene mscene in m_localScenes)
396 (mscene.RegionInfo.InternalEndPoint.Port == ipEndPoint.Port))
397 { 424 {
398 scene = mscene; 425 if ((mscene.RegionInfo.InternalEndPoint.Equals(ipEndPoint.Address)) &&
399 return true; 426 (mscene.RegionInfo.InternalEndPoint.Port == ipEndPoint.Port))
427 {
428 scene = mscene;
429 return true;
430 }
400 } 431 }
401 } 432 }
402 433
@@ -465,11 +496,14 @@ namespace OpenSim.Region.Framework.Scenes
465 496
466 public RegionInfo GetRegionInfo(UUID regionID) 497 public RegionInfo GetRegionInfo(UUID regionID)
467 { 498 {
468 foreach (Scene scene in m_localScenes) 499 lock (m_localScenes)
469 { 500 {
470 if (scene.RegionInfo.RegionID == regionID) 501 foreach (Scene scene in m_localScenes)
471 { 502 {
472 return scene.RegionInfo; 503 if (scene.RegionInfo.RegionID == regionID)
504 {
505 return scene.RegionInfo;
506 }
473 } 507 }
474 } 508 }
475 509
@@ -488,11 +522,14 @@ namespace OpenSim.Region.Framework.Scenes
488 522
489 public bool TryGetScenePresence(UUID avatarId, out ScenePresence avatar) 523 public bool TryGetScenePresence(UUID avatarId, out ScenePresence avatar)
490 { 524 {
491 foreach (Scene scene in m_localScenes) 525 lock (m_localScenes)
492 { 526 {
493 if (scene.TryGetScenePresence(avatarId, out avatar)) 527 foreach (Scene scene in m_localScenes)
494 { 528 {
495 return true; 529 if (scene.TryGetScenePresence(avatarId, out avatar))
530 {
531 return true;
532 }
496 } 533 }
497 } 534 }
498 535
@@ -503,12 +540,16 @@ namespace OpenSim.Region.Framework.Scenes
503 public bool TryGetAvatarsScene(UUID avatarId, out Scene scene) 540 public bool TryGetAvatarsScene(UUID avatarId, out Scene scene)
504 { 541 {
505 ScenePresence avatar = null; 542 ScenePresence avatar = null;
506 foreach (Scene mScene in m_localScenes) 543
544 lock (m_localScenes)
507 { 545 {
508 if (mScene.TryGetScenePresence(avatarId, out avatar)) 546 foreach (Scene mScene in m_localScenes)
509 { 547 {
510 scene = mScene; 548 if (mScene.TryGetScenePresence(avatarId, out avatar))
511 return true; 549 {
550 scene = mScene;
551 return true;
552 }
512 } 553 }
513 } 554 }
514 555
@@ -518,17 +559,22 @@ namespace OpenSim.Region.Framework.Scenes
518 559
519 public void CloseScene(Scene scene) 560 public void CloseScene(Scene scene)
520 { 561 {
521 m_localScenes.Remove(scene); 562 lock (m_localScenes)
563 m_localScenes.Remove(scene);
564
522 scene.Close(); 565 scene.Close();
523 } 566 }
524 567
525 public bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) 568 public bool TryGetAvatarByName(string avatarName, out ScenePresence avatar)
526 { 569 {
527 foreach (Scene scene in m_localScenes) 570 lock (m_localScenes)
528 { 571 {
529 if (scene.TryGetAvatarByName(avatarName, out avatar)) 572 foreach (Scene scene in m_localScenes)
530 { 573 {
531 return true; 574 if (scene.TryGetAvatarByName(avatarName, out avatar))
575 {
576 return true;
577 }
532 } 578 }
533 } 579 }
534 580
@@ -538,7 +584,8 @@ namespace OpenSim.Region.Framework.Scenes
538 584
539 public void ForEachScene(Action<Scene> action) 585 public void ForEachScene(Action<Scene> action)
540 { 586 {
541 m_localScenes.ForEach(action); 587 lock (m_localScenes)
588 m_localScenes.ForEach(action);
542 } 589 }
543 } 590 }
544} 591} \ No newline at end of file