[smuxi/stable: 7/7] Engine: fixed thread-safety of UserConfig.get_Item()



commit 44bfda284872a42f12f3530b341ee8962d07f506
Author: Mirco Bauer <meebey meebey net>
Date:   Tue Jun 2 21:24:22 2015 +0200

    Engine: fixed thread-safety of UserConfig.get_Item()
    
        2015-06-02 20:37:14,520 [Main] INFO  Smuxi.Frontend.Gnome.CommandLineInterface - Opening the link...
        2015-06-02 20:37:14,848 [Main] ERROR Smuxi.Frontend.Gnome.Frontend - ShowException(): Exception:
        System.ArgumentException: Key duplication when adding: Servers/Servers
          at System.Collections.Hashtable.PutImpl (System.Object key, System.Object value, Boolean overwrite) 
[0x00000] in <filename unknown>:0
          at System.Collections.Hashtable.Add (System.Object key, System.Object value) [0x00000] in <filename 
unknown>:0
          at Smuxi.Engine.UserConfig.get_Item (System.String key) [0x00000] in <filename unknown>:0
          at (wrapper remoting-invoke-with-check) Smuxi.Engine.UserConfig:get_Item (string)
          at Smuxi.Engine.ServerListController.GetServerList () [0x00000] in <filename unknown>:0
          at Smuxi.Engine.ServerListController.GetServerByNetwork (System.String network) [0x00000] in 
<filename unknown>:0
          at Smuxi.Frontend.Gnome.Frontend.TryOpenChatLink (System.Uri link) [0x00000] in <filename unknown>:0
          at Smuxi.Frontend.Gnome.Frontend.OpenLink (System.Uri link) [0x00000] in <filename unknown>:0
          at Smuxi.Frontend.Gnome.CommandLineInterface+<OpenLink>c__AnonStorey1.<>m__1 (System.Object o, 
System.EventArgs e) [0x00000] in <filename unknown>:0
          at Gtk.Application+InvokeCB.Invoke () [0x00000] in <filename unknown>:0
          at GLib.Timeout+TimeoutProxy.Handler () [0x00000] in <filename unknown>:0

 src/Engine/Config/UserConfig.cs |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)
---
diff --git a/src/Engine/Config/UserConfig.cs b/src/Engine/Config/UserConfig.cs
index 846b3dc..789e839 100644
--- a/src/Engine/Config/UserConfig.cs
+++ b/src/Engine/Config/UserConfig.cs
@@ -1,7 +1,7 @@
 /*
  * Smuxi - Smart MUltipleXed Irc
  *
- * Copyright (c) 2005-2006, 2010-2011, 2013 Mirco Bauer <meebey meebey net>
+ * Copyright (c) 2005-2006, 2010-2011, 2013, 2015 Mirco Bauer <meebey meebey net>
  *
  * Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
  *
@@ -55,7 +55,10 @@ namespace Smuxi.Engine
                 }
             }
         }
-        
+
+        /// <remarks>
+        /// This property is thread-safe.
+        /// </remarks>
         public object this[string key]
         {
             get {
@@ -77,7 +80,7 @@ namespace Smuxi.Engine
                 obj = _Config[_UserPrefix + key];
                 if (obj != null) {
                     if (IsCaching) {
-                        _Cache.Add(key, obj);
+                        _Cache[key] = obj;
                     }
                     return obj;
                 }
@@ -89,7 +92,7 @@ namespace Smuxi.Engine
                 }
 #endif
                 if (IsCaching) {
-                    _Cache.Add(key, obj);
+                    _Cache[key] = obj;
                 }
 
                 return obj;
@@ -182,7 +185,7 @@ namespace Smuxi.Engine
 
             var start = DateTime.UtcNow;
             var conf = _Config.GetAll();
-            var cache = new Hashtable(conf.Count);
+            var cache = Hashtable.Synchronized(new Hashtable(conf.Count));
             foreach (var entry in conf) {
                 if (!entry.Key.StartsWith(_UserPrefix)) {
                     // no need to cache values of other users


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]