Add locking around the ServiceModel.Logger, fixes a race reported on the mono-devel...
authorMiguel de Icaza <miguel@gnome.org>
Thu, 10 Nov 2011 04:12:28 +0000 (23:12 -0500)
committerMiguel de Icaza <miguel@gnome.org>
Thu, 10 Nov 2011 04:12:51 +0000 (23:12 -0500)
mcs/class/System.ServiceModel/System.ServiceModel/Logger.cs

index 9f58d4d225b7ef21bb12998561d94a67478171a9..3f055c77ed0a484dc66fa1078cb24d2eb2e8d99d 100644 (file)
@@ -140,18 +140,20 @@ namespace System.ServiceModel
 
                static void Log (TraceEventType eventType, string message, params object [] args)
                {
-                       event_id++;
+                       lock (log_writer){
+                               event_id++;
 #if NET_2_1
-                       log_writer.Write ("[{0}] ", event_id);
+                               log_writer.Write ("[{0}] ", event_id);
 #endif
-                       TraceCore (TraceEventType.Information, event_id,
-                               false, Guid.Empty, // FIXME
-                               message, args);
-                       log_writer.WriteLine (message, args);
-                       log_writer.Flush ();
+                               TraceCore (TraceEventType.Information, event_id,
+                                       false, Guid.Empty, // FIXME
+                                       message, args);
+                               log_writer.WriteLine (message, args);
+                               log_writer.Flush ();
 #if !NET_2_1
-                       source.TraceEvent (eventType, event_id, message, args);
+                               source.TraceEvent (eventType, event_id, message, args);
 #endif
+                       }
                }
                
                #endregion
@@ -191,18 +193,18 @@ namespace System.ServiceModel
                        xw.Close ();
 
                        event_id++;
-
+                       lock (log_writer){
 #if NET_2_1
-                       log_writer.Write ("[{0}] ", event_id);
+                               log_writer.Write ("[{0}] ", event_id);
 
-                       TraceCore (TraceEventType.Information, event_id, /*FIXME*/false, /*FIXME*/Guid.Empty, sw);
+                               TraceCore (TraceEventType.Information, event_id, /*FIXME*/false, /*FIXME*/Guid.Empty, sw);
 #else
-                       TraceCore (TraceEventType.Information, event_id, /*FIXME*/false, /*FIXME*/Guid.Empty, doc.CreateNavigator ());
+                               TraceCore (TraceEventType.Information, event_id, /*FIXME*/false, /*FIXME*/Guid.Empty, doc.CreateNavigator ());
 
-                       message_source.TraceData (TraceEventType.Information, event_id, doc.CreateNavigator ());
+                               message_source.TraceData (TraceEventType.Information, event_id, doc.CreateNavigator ());
 #endif
-
-                       log_writer.Flush ();
+                               log_writer.Flush ();
+                       }
                }
 
                #endregion