[vmkit-commits] [vmkit] r76550 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaObject.cpp JnjvmClassLoader.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Jul 21 01:38:58 PDT 2009


Author: geoffray
Date: Tue Jul 21 03:38:40 2009
New Revision: 76550

URL: http://llvm.org/viewvc/llvm-project?rev=76550&view=rev
Log:
Add llvm_gcroot's.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=76550&r1=76549&r2=76550&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Tue Jul 21 03:38:40 2009
@@ -19,6 +19,7 @@
 using namespace jnjvm;
 
 LockObj* LockObj::allocate(JavaObject* owner) {
+  llvm_gcroot(owner, 0);
 #ifdef USE_GC_BOEHM
   LockObj* res = new LockObj();
 #else
@@ -34,9 +35,12 @@
 }
 
 void JavaObject::waitIntern(struct timeval* info, bool timed) {
+  LockObj* l = 0;
+  llvm_gcroot(this, 0);
+  llvm_gcroot(l, 0);
 
   if (owner()) {
-    LockObj * l = lock.changeToFatlock(this);
+    l = lock.changeToFatlock(this);
     JavaThread* thread = JavaThread::get();
     thread->waitsOn = l;
     mvm::Cond& varcondThread = thread->varcond;
@@ -128,16 +132,22 @@
 }
 
 void JavaObject::wait() {
+  llvm_gcroot(this, 0);
   waitIntern(0, false);
 }
 
 void JavaObject::timedWait(struct timeval& info) {
+  llvm_gcroot(this, 0);
   waitIntern(&info, true);
 }
 
 void JavaObject::notify() {
+  LockObj* l = 0;
+  llvm_gcroot(this, 0);
+  llvm_gcroot(l, 0);
+
   if (owner()) {
-    LockObj * l = lock.getFatLock();
+    l = lock.getFatLock();
     if (l) {
       JavaThread* cur = l->firstThread;
       if (cur) {
@@ -177,8 +187,12 @@
 }
 
 void JavaObject::notifyAll() {
+  LockObj* l = 0;
+  llvm_gcroot(this, 0);
+  llvm_gcroot(l, 0);
+  
   if (owner()) {
-    LockObj * l = lock.getFatLock();
+    l = lock.getFatLock();
     if (l) {
       JavaThread* cur = l->firstThread;
       if (cur) {
@@ -203,6 +217,8 @@
                                     const Typedef* signature) {
 
   JavaObject* obj = this;
+  llvm_gcroot(obj, 0);
+
   if (!signature->isPrimitive()) {
     if (obj && !(obj->getClass()->isOfTypeName(signature->getName()))) {
       vm->illegalArgumentException("wrong type argument");
@@ -343,6 +359,8 @@
 }
 
 bool JavaObject::instanceOf(UserCommonClass* cl) {
+  llvm_gcroot(this, 0);
+
   if (!this) return false;
   else return this->getClass()->isAssignableFrom(cl);
 }

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=76550&r1=76549&r2=76550&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Jul 21 03:38:40 2009
@@ -341,6 +341,7 @@
     char* buf = (char*)alloca(strLen + alen + 7);
 
     sprintf(buf, "%s%s.class", str, asciiz);
+    // This array is not allocated by the GC.
     res = Reader::openFile(this, buf);
     if (res) return res;
   }
@@ -351,6 +352,7 @@
     ZipArchive* archive = *i;
     char* buf = (char*)alloca(alen + 7);
     sprintf(buf, "%s.class", asciiz);
+    // This array is not allocated by the GC.
     res = Reader::openZip(this, archive, buf);
     if (res) return res;
   }
@@ -362,10 +364,13 @@
 UserClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name,
                                               bool doResolve,
                                               JavaString* strName) {
-  
+ 
+  llvm_gcroot(strName, 0);
+
   UserCommonClass* cl = lookupClass(name);
   
   if (!cl) {
+    // This array is not allocated by the GC.
     ArrayUInt8* bytes = openName(name);
     if (bytes) {
       cl = constructClass(name, bytes);
@@ -382,6 +387,10 @@
 
 UserClass* JnjvmClassLoader::internalLoad(const UTF8* name, bool doResolve,
                                           JavaString* strName) {
+  JavaObject* obj = 0;
+  llvm_gcroot(strName, 0);
+  llvm_gcroot(obj, 0);
+  
   UserCommonClass* cl = lookupClass(name);
   
   if (!cl) {
@@ -390,10 +399,8 @@
     if (!strName) {
       strName = JavaString::internalToJava(name, isolate);
     }
-    JavaObject* obj = (JavaObject*)
-      upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp,
-                                                          javaLoader, strName,
-                                                          doResolve);
+    obj = upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp,
+                                              javaLoader, strName, doResolve);
     cl = (UserCommonClass*)((JavaObjectClass*)obj)->getClass();
   }
   
@@ -407,7 +414,8 @@
 
 UserClass* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve,
                                       bool doThrow, JavaString* strName) {
- 
+  
+  llvm_gcroot(strName, 0);
 
   UserClass* cl = internalLoad(name, doResolve, strName);
 
@@ -511,6 +519,8 @@
                                                          bool doResolve,
                                                          bool doThrow,
                                                          JavaString* strName) {
+  llvm_gcroot(strName, 0);
+  
   if (name->size == 0) {
     return 0;
   } else if (name->elements[0] == I_TAB) {
@@ -564,6 +574,8 @@
 JnjvmClassLoader::loadClassFromJavaString(JavaString* str, bool doResolve,
                                           bool doThrow) {
   
+  llvm_gcroot(str, 0);
+  
   UTF8* name = (UTF8*)alloca(sizeof(UTF8) + str->count * sizeof(uint16));
  
   if (name) {
@@ -591,6 +603,8 @@
 
 UserCommonClass* JnjvmClassLoader::lookupClassFromJavaString(JavaString* str) {
   
+  llvm_gcroot(str, 0);
+  
   UTF8* name = (UTF8*)alloca(sizeof(UTF8) + str->count * sizeof(uint16));
   if (name) {
     name->size = str->count;
@@ -653,6 +667,9 @@
 
 UserClass* JnjvmClassLoader::constructClass(const UTF8* name,
                                             ArrayUInt8* bytes) {
+  
+  // The array of bytes might be GC-allocated or malloc'd. Consider
+  // that this function can never be interrupted.
   assert(bytes && "constructing a class without bytes");
   classes->lock.lock();
   ClassMap::iterator End = classes->map.end();
@@ -831,12 +848,17 @@
 JnjvmClassLoader*
 JnjvmClassLoader::getJnjvmLoaderFromJavaObject(JavaObject* loader, Jnjvm* vm) {
   
+  VMClassLoader* vmdata = 0
+  
+  llvm_gcroot(loader, 0);
+  llvm_gcroot(vmdata, 0);
+  
   if (loader == 0)
     return vm->bootstrapLoader;
  
   JnjvmClassLoader* JCL = 0;
   Classpath* upcalls = vm->bootstrapLoader->upcalls;
-  VMClassLoader* vmdata = 
+  vmdata = 
     (VMClassLoader*)(upcalls->vmdataClassLoader->getObjectField(loader));
   
   if (!vmdata) {





More information about the vmkit-commits mailing list