SpinLock performance improvements
authorJérémie Laval <jeremie.laval@gmail.com>
Thu, 4 Nov 2010 15:49:21 +0000 (15:49 +0000)
committerJérémie Laval <jeremie.laval@gmail.com>
Thu, 4 Nov 2010 15:51:33 +0000 (15:51 +0000)
mcs/class/corlib/System.Threading/SpinLock.cs

index 4191acbeaf31d149d928a97c19e3599c4b856382..daadbe9be24000e19cca54aabc6b9d5a5750fe18 100644 (file)
@@ -49,6 +49,8 @@ namespace System.Threading
                int threadWhoTookLock;
                readonly bool isThreadOwnerTrackingEnabled;
 
+               static Watch sw = Watch.StartNew ();
+
                public bool IsThreadOwnerTrackingEnabled {
                        get {
                                return isThreadOwnerTrackingEnabled;
@@ -120,7 +122,7 @@ namespace System.Threading
                        if (isThreadOwnerTrackingEnabled && IsHeldByCurrentThread)
                                throw new LockRecursionException ();
 
-                       Watch sw = Watch.StartNew ();
+                       long start = milliSeconds == -1 ? 0 : sw.ElapsedMilliseconds;
 
                        do {
                                long u = ticket.Users;
@@ -134,7 +136,7 @@ namespace System.Threading
                                        threadWhoTookLock = Thread.CurrentThread.ManagedThreadId;
                                        break;
                                }
-                       } while (milliSeconds == -1 || (milliSeconds > 0 && sw.ElapsedMilliseconds < milliSeconds));
+                       } while (milliSeconds == -1 || (sw.ElapsedMilliseconds - start) < milliSeconds);
                }
 
                public void Exit ()