[vmkit-commits] [vmkit] r120903 - in /vmkit/trunk/lib/J3/VMCore: JNIReferences.h JavaClass.cpp JavaThread.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h LockedMap.cpp VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Dec 4 03:03:31 PST 2010


Author: geoffray
Date: Sat Dec  4 05:03:31 2010
New Revision: 120903

URL: http://llvm.org/viewvc/llvm-project?rev=120903&view=rev
Log:
Continue adding write barriers in J3 code. Some are not strictly necessary because the objects will be traced by the global roots anyway, but we first have to make sure to get things right.


Modified:
    vmkit/trunk/lib/J3/VMCore/JNIReferences.h
    vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/J3/VMCore/JavaThread.cpp
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
    vmkit/trunk/lib/J3/VMCore/LockedMap.cpp
    vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp

Modified: vmkit/trunk/lib/J3/VMCore/JNIReferences.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JNIReferences.h?rev=120903&r1=120902&r2=120903&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JNIReferences.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JNIReferences.h Sat Dec  4 05:03:31 2010
@@ -69,7 +69,8 @@
       return next->addJNIReference(obj);
     } else {
       ++count;
-      globalReferences[length] = obj;
+      mvm::Collector::objectReferenceNonHeapWriteBarrier(
+          (gc**)&(globalReferences[length]), (gc*)obj);
       return &globalReferences[length++];
     }
   }
@@ -77,7 +78,7 @@
   void removeJNIReference(JavaObject** obj) {
     if (((uintptr_t)obj >= (uintptr_t)globalReferences) &&
         ((uintptr_t)obj) < (uintptr_t)(globalReferences + MAXIMUM_REFERENCES)) {
-      *obj = 0;
+      *obj = NULL;
       --count;
     } else {
       assert(next && "No global reference located there");

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=120903&r1=120902&r2=120903&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Sat Dec  4 05:03:31 2010
@@ -1066,8 +1066,13 @@
 
   prev = (JavaObject*)__sync_val_compare_and_swap((uintptr_t)obj, NULL, val);
 
-  if (!prev) return val;
-  else return prev;
+  if (prev == NULL) {
+    // Write it again to execute the write barrier.
+    mvm::Collector::objectReferenceNonHeapWriteBarrier((gc**)obj, (gc*)val);
+    return val;
+  } else {
+    return prev;
+  }
 }
 
 #else
@@ -1078,8 +1083,14 @@
   llvm_gcroot(prev, 0);
   prev = (JavaObject*)__sync_val_compare_and_swap(&(delegatee[0]), NULL, val);
 
-  if (!prev) return val;
-  else return prev;
+  if (prev == NULL) {
+    // Write it again to execute the write barrier.
+    mvm::Collector::objectReferenceNonHeapWriteBarrier(
+        (gc**)&(delegatee[0]), (gc*)val);
+    return val;
+  } else {
+    return prev;
+  }
 }
 
 #endif

Modified: vmkit/trunk/lib/J3/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaThread.cpp?rev=120903&r1=120902&r2=120903&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaThread.cpp Sat Dec  4 05:03:31 2010
@@ -40,8 +40,10 @@
 void JavaThread::initialise(JavaObject* thread, JavaObject* vmth) {
   llvm_gcroot(thread, 0);
   llvm_gcroot(vmth, 0);
-  javaThread = thread;
-  vmThread = vmth;
+  mvm::Collector::objectReferenceNonHeapWriteBarrier(
+      (gc**)&javaThread, (gc*)thread);
+  mvm::Collector::objectReferenceNonHeapWriteBarrier(
+      (gc**)&vmThread, (gc*)vmth);
 }
 
 JavaThread::~JavaThread() {
@@ -153,7 +155,8 @@
     next->prev = this;
     return next->addJNIReference(th, obj);
   } else {
-    localReferences[length] = obj;
+    mvm::Collector::objectReferenceNonHeapWriteBarrier(
+        (gc**)&(localReferences[length]), (gc*)obj);
     return &localReferences[length++];
   }
 }

Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=120903&r1=120902&r2=120903&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Sat Dec  4 05:03:31 2010
@@ -274,7 +274,8 @@
   strings = new(allocator, "StringList") StringList();
 
   vmdata->JCL = this;
-  javaLoader = loader;
+  mvm::Collector::objectReferenceNonHeapWriteBarrier(
+      (gc**)&javaLoader, (gc*)loader);
   isolate = I;
 
   JavaMethod* meth = bootstrapLoader->upcalls->loadInClassLoader;

Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h?rev=120903&r1=120902&r2=120903&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h Sat Dec  4 05:03:31 2010
@@ -513,7 +513,8 @@
       JCL->strings = next;
       return next->addString(JCL, obj);
     } else {
-      strings[length] = obj;
+      mvm::Collector::objectReferenceNonHeapWriteBarrier(
+          (gc**)&(strings[length]), (gc*)obj);
       return &strings[length++];
     }
   }

Modified: vmkit/trunk/lib/J3/VMCore/LockedMap.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/LockedMap.cpp?rev=120903&r1=120902&r2=120903&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/LockedMap.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/LockedMap.cpp Sat Dec  4 05:03:31 2010
@@ -10,17 +10,24 @@
 #include <map>
 
 #include "JavaArray.h"
-#include "JavaClass.h"
 #include "JavaString.h"
-#include "JavaTypes.h"
 #include "LockedMap.h"
-#include "Zip.h"
-
-#include <cstring>
 
 using namespace j3;
 
 void StringMap::insert(JavaString* str) {
+  const ArrayUInt16* array = NULL;
   llvm_gcroot(str, 0);
-  map.insert(std::make_pair(JavaString::getValue(str), str));
+  llvm_gcroot(array, 0);
+  array = JavaString::getValue(str);
+  StringMap::iterator it = map.insert(std::make_pair(array, str)).first;
+  assert(map.find(array)->second == str);
+  assert(map.find(array)->first == array);
+  assert(&(map.find(array)->second) == &(it->second));
+  assert(&(map.find(array)->first) == &(it->first));
+  // Inform the GC that we just stored a string here.
+  mvm::Collector::objectReferenceNonHeapWriteBarrier(
+      (gc**)&(it->second), (gc*)str);
+  mvm::Collector::objectReferenceNonHeapWriteBarrier(
+      (gc**)&(it->first), (gc*)array);
 }

Modified: vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp?rev=120903&r1=120902&r2=120903&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp Sat Dec  4 05:03:31 2010
@@ -18,6 +18,9 @@
 //     referenced by classes.
 // (4) Tracing the roots of a program: the JVM and the threads.
 //
+// Additionnaly, all write of GC objets in J3 data structures must go through
+// a write barrier.
+//
 //===----------------------------------------------------------------------===//
 
 #include "ClasspathReflect.h"
@@ -229,20 +232,15 @@
 void JnjvmBootstrapLoader::tracer(uintptr_t closure) {
  
   JnjvmClassLoader::tracer(closure);
-
-#define TRACE_DELEGATEE(prim) \
-  prim->tracer(closure);
-
-  TRACE_DELEGATEE(upcalls->OfVoid);
-  TRACE_DELEGATEE(upcalls->OfBool);
-  TRACE_DELEGATEE(upcalls->OfByte);
-  TRACE_DELEGATEE(upcalls->OfChar);
-  TRACE_DELEGATEE(upcalls->OfShort);
-  TRACE_DELEGATEE(upcalls->OfInt);
-  TRACE_DELEGATEE(upcalls->OfFloat);
-  TRACE_DELEGATEE(upcalls->OfLong);
-  TRACE_DELEGATEE(upcalls->OfDouble);
-#undef TRACE_DELEGATEE
+  upcalls->OfVoid->tracer(closure);
+  upcalls->OfBool->tracer(closure);
+  upcalls->OfByte->tracer(closure);
+  upcalls->OfChar->tracer(closure);
+  upcalls->OfShort->tracer(closure);
+  upcalls->OfInt->tracer(closure);
+  upcalls->OfFloat->tracer(closure);
+  upcalls->OfLong->tracer(closure);
+  upcalls->OfDouble->tracer(closure);
 }
 
 //===----------------------------------------------------------------------===//
@@ -316,24 +314,12 @@
   for (i = i + 1; i < mvm::LockSystem::GlobalSize; i++) {
     assert(lockSystem.LockTable[i] == NULL);
   }
-
-
-#if defined(ISOLATE_SHARING)
-  mvm::Collector::markAndTraceRoot(&JnjvmSharedLoader::sharedLoader, closure);
-#endif
-  
-#ifdef SERVICE
-  parent->tracer(closure);
-#endif
 }
 
 void JavaThread::tracer(uintptr_t closure) {
   mvm::Collector::markAndTraceRoot(&pendingException, closure);
   mvm::Collector::markAndTraceRoot(&javaThread, closure);
   mvm::Collector::markAndTraceRoot(&vmThread, closure);
-#ifdef SERVICE
-  mvm::Collector::markAndTraceRoot(&ServiceException, closure);
-#endif
   
   JNILocalReferences* end = localJNIRefs;
   while (end != NULL) {





More information about the vmkit-commits mailing list