[vmkit-commits] [vmkit] r85506 - /vmkit/trunk/include/mvm/Threads/Locks.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu Oct 29 07:00:17 PDT 2009


Author: geoffray
Date: Thu Oct 29 09:00:16 2009
New Revision: 85506

URL: http://llvm.org/viewvc/llvm-project?rev=85506&view=rev
Log:
Don't apply a lock mask on non-GC objects.


Modified:
    vmkit/trunk/include/mvm/Threads/Locks.h

Modified: vmkit/trunk/include/mvm/Threads/Locks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Locks.h?rev=85506&r1=85505&r2=85506&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/Threads/Locks.h (original)
+++ vmkit/trunk/include/mvm/Threads/Locks.h Thu Oct 29 09:00:16 2009
@@ -200,6 +200,10 @@
   public:
     static void gcroot(void* val, void* unused) 
       __attribute__ ((always_inline)) {}
+
+    static uintptr_t mask() {
+      return 0;
+    }
   };
   
   class FatLockWithGC {
@@ -208,6 +212,10 @@
       __attribute__ ((always_inline)) {
       llvm_gcroot(val, unused);
     }
+    
+    static uintptr_t mask() {
+      return GCMask;
+    }
   };
 
 
@@ -253,7 +261,7 @@
       uint32 count = lock & ThinCountMask;
       obj->acquireAll(count + 1);
       uintptr_t oldLock = lock;
-      lock = obj->getID() | (oldLock & GCMask);
+      lock = obj->getID() | (oldLock & IsGC::mask());
       return obj;
     } else {
       TFatLock* res = TFatLock::getFromID(lock);
@@ -268,11 +276,11 @@
 start:
     uint64_t id = mvm::Thread::get()->getThreadID();
     uintptr_t oldValue = lock;
-    uintptr_t newValue = id | (lock & GCMask);
-    uintptr_t val = __sync_val_compare_and_swap(&lock, oldValue & GCMask,
+    uintptr_t newValue = id | (lock & IsGC::mask());
+    uintptr_t val = __sync_val_compare_and_swap(&lock, oldValue & IsGC::mask(),
                                                 newValue);
 
-    if (val != (oldValue & GCMask)) {
+    if (val != (oldValue & IsGC::mask())) {
       //fat!
       if (!(val & FatMask)) {
         if ((val & Thread::IDMask) == id) {
@@ -285,7 +293,7 @@
           TFatLock* obj = TFatLock::allocate(O);
           uintptr_t val = obj->getID();
 loop:
-          while (lock) {
+          while (lock & ~IsGC::mask()) {
             if (lock & FatMask) {
               obj->deallocate();
               goto end;
@@ -294,10 +302,11 @@
           }
         
           oldValue = lock;
-          newValue = val | (lock & GCMask);
-          uintptr_t test = __sync_val_compare_and_swap(&lock, oldValue & GCMask,
+          newValue = val | (lock & IsGC::mask());
+          uintptr_t test = __sync_val_compare_and_swap(&lock,
+                                                       oldValue & IsGC::mask(),
                                                        newValue);
-          if (test != (oldValue & GCMask)) goto loop;
+          if (test != (oldValue & IsGC::mask())) goto loop;
           if (!obj->acquire(O)) goto start;
         }
       } else {
@@ -320,8 +329,8 @@
     IsGC::gcroot(O, 0);
     assert(owner() && "Not owner when entering release!");
     uint64 id = mvm::Thread::get()->getThreadID();
-    if ((lock & ~GCMask) == id) {
-      lock = lock & GCMask;
+    if ((lock & ~IsGC::mask()) == id) {
+      lock = lock & IsGC::mask();
     } else if (lock & FatMask) {
       TFatLock* obj = TFatLock::getFromID(lock);
       assert(obj && "Lock deallocated while held.");





More information about the vmkit-commits mailing list