[banshee] [SourceManager] More thread safeness
- From: Gabriel Burt <gburt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [banshee] [SourceManager] More thread safeness
- Date: Wed, 11 Aug 2010 16:28:04 +0000 (UTC)
commit ae9419269615829c9e8f3a04022f7881cc2d64c8
Author: Gabriel Burt <gabriel burt gmail com>
Date: Wed Aug 11 09:26:35 2010 -0700
[SourceManager] More thread safeness
Fixes bug introduced by lazy loading sources, where they could be lazy
loaded during the delayed initialization of another extension, thereby
modifying the enumerable of extensions to delayed initialize (bgo#626596)
.../Banshee.ServiceStack/ServiceManager.cs | 18 +++++++++++-------
1 files changed, 11 insertions(+), 7 deletions(-)
---
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
index cd38f1f..ed16579 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
@@ -27,6 +27,7 @@
//
using System;
+using System.Linq;
using System.IO;
using System.Collections.Generic;
@@ -251,7 +252,8 @@ namespace Banshee.ServiceStack
if (!delayed_initialized) {
have_client = true;
var initialized = new HashSet <string> ();
- foreach (IService service in services.Values) {
+ var to_initialize = services.Values.ToList ();
+ foreach (IService service in to_initialize) {
if (!initialized.Contains (service.ServiceName)) {
DelayedInitialize (service);
initialized.Add (service.ServiceName);
@@ -340,13 +342,15 @@ namespace Banshee.ServiceStack
public static T Get<T> () where T : class, IService
{
- Type type = typeof (T);
- T service = Get (type.Name) as T;
- if (service == null && type.GetInterface ("Banshee.ServiceStack.IRegisterOnDemandService") != null) {
- return RegisterService (type) as T;
- }
+ lock (self_mutex) {
+ Type type = typeof (T);
+ T service = Get (type.Name) as T;
+ if (service == null && type.GetInterface ("Banshee.ServiceStack.IRegisterOnDemandService") != null) {
+ return RegisterService (type) as T;
+ }
- return service;
+ return service;
+ }
}
private static void Add (IService service)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]