[vmkit-commits] [vmkit] r59136 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h Jnjvm.cpp Jnjvm.h JnjvmConfig.h LowerConstantCalls.cpp VirtualTables.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Wed Nov 12 06:21:00 PST 2008
Author: geoffray
Date: Wed Nov 12 08:21:00 2008
New Revision: 59136
URL: http://llvm.org/viewvc/llvm-project?rev=59136&view=rev
Log:
Implement a task class mirror for an isolate environment.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
vmkit/trunk/lib/JnJVM/VMCore/JnjvmConfig.h
vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp
vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=59136&r1=59135&r2=59136&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Nov 12 08:21:00 2008
@@ -279,7 +279,11 @@
access = 0;
ownerClass = 0;
#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
- this->delegatee = 0;
+ _delegatee = 0;
+#else
+#if defined(ISOLATE)
+ memset(IsolateInfo, 0, sizeof(TaskClassMirror) * NR_ISOLATES);
+#endif
#endif
}
@@ -987,3 +991,9 @@
void Class::resolveStaticClass() {
classLoader->getModule()->resolveStaticClass((Class*)this);
}
+
+#ifdef ISOLATE
+TaskClassMirror& CommonClass::getCurrentTaskClassMirror() {
+ return IsolateInfo[JavaThread::get()->isolate->IsolateID];
+}
+#endif
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=59136&r1=59135&r2=59136&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Nov 12 08:21:00 2008
@@ -25,6 +25,8 @@
#include "JavaAccess.h"
#include "JnjvmClassLoader.h"
+#include "JnjvmConfig.h"
+
namespace jnjvm {
class ArrayUInt8;
@@ -117,6 +119,16 @@
};
+
+#ifdef ISOLATE
+class TaskClassMirror {
+public:
+ JavaState status;
+ JavaObject* delegatee;
+ JavaObject* staticInstance;
+};
+#endif
+
/// CommonClass - This class is the root class of all Java classes. It is
/// GC-allocated because CommonClasses have to be traceable. A java/lang/Class
/// object that stays in memory has a reference to the class. Same for
@@ -270,13 +282,7 @@
/// classLoader - The Jnjvm class loader that loaded the class.
///
JnjvmClassLoader* classLoader;
-
-#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
- /// delegatee - The java/lang/Class object representing this class
- ///
- JavaObject* delegatee;
-#endif
-
+
/// virtualFields - List of all the virtual fields defined in this class.
/// This does not contain non-redefined super fields.
JavaField* virtualFields;
@@ -346,6 +352,14 @@
///
mvm::Thread* ownerClass;
+ mvm::Thread* getOwnerClass() {
+ return ownerClass;
+ }
+
+ void setOwnerClass(mvm::Thread* th) {
+ ownerClass = th;
+ }
+
/// lookupMethodDontThrow - Lookup a method in the method map of this class.
/// Do not throw if the method is not found.
///
@@ -429,22 +443,7 @@
///
void initialiseClass(Jnjvm* vm);
-
- /// getStatus - Get the resolution/initialization status of this class.
- ///
- JavaState getStatus() {
- return status;
- }
- /// isReady - Has this class been initialized?
- ///
- bool isReady() {
- return status == ready;
- }
-
- bool isInitializing() {
- return status >= inClinit;
- }
-
+
/// isResolved - Has this class been resolved?
///
bool isResolved() {
@@ -480,6 +479,69 @@
return this;
}
+#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+ /// delegatee - The java/lang/Class object representing this class
+ ///
+ JavaObject* _delegatee;
+
+ JavaObject* getDelegatee() {
+ return _delegatee;
+ }
+
+ void setDelegatee(JavaObject* val) {
+ _delegatee = val;
+ }
+
+ JavaState getInitializationState() {
+ return status;
+ }
+
+ void setInitializationState(JavaState st) {
+ status = st;
+ }
+
+ /// isReady - Has this class been initialized?
+ ///
+ bool isReady() {
+ return status == ready;
+ }
+
+ bool isInitializing() {
+ return status >= inClinit;
+ }
+
+#else
+#if defined(ISOLATE)
+ TaskClassMirror IsolateInfo[NR_ISOLATES];
+
+ TaskClassMirror& getCurrentTaskClassMirror();
+
+ JavaState getInitializationState() {
+ return getCurrentTaskClassMirror().status;
+ }
+
+ void setInitializationState(JavaState st) {
+ getCurrentTaskClassMirror().status = st;
+ }
+
+ JavaObject* getDelegatee() {
+ return getCurrentTaskClassMirror().delegatee;
+ }
+
+ void setDelegatee(JavaObject* val) {
+ getCurrentTaskClassMirror().delegatee = val;
+ }
+
+ bool isReady() {
+ return getCurrentTaskClassMirror().status == ready;
+ }
+
+ bool isInitializing() {
+ return getCurrentTaskClassMirror().status >= inClinit;
+ }
+#endif
+#endif
+
};
/// ClassPrimitive - This class represents internal classes for primitive
@@ -513,7 +575,7 @@
Attribut* attributs;
uint16 nbAttributs;
-#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+#if !defined(ISOLATE_SHARING)
/// innerClasses - The inner classes of this class.
///
Class** innerClasses;
@@ -600,6 +662,17 @@
void setStaticInstance(JavaObject* val) {
_staticInstance = val;
}
+#else
+#if defined(ISOLATE)
+ JavaObject* getStaticInstance() {
+ return getCurrentTaskClassMirror().staticInstance;
+ }
+
+ void setStaticInstance(JavaObject* val) {
+ getCurrentTaskClassMirror().staticInstance = val;
+ }
+
+#endif
#endif
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=59136&r1=59135&r2=59136&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Nov 12 08:21:00 2008
@@ -68,10 +68,10 @@
// verification step failed or because initialization was attempted and
// failed.
- assert(status >= resolved || ownerClass || status == ready ||
+ assert(status >= resolved || getOwnerClass() || status == ready ||
status == erroneous && "Class in wrong state");
- if (status != ready) {
+ if (getInitializationState() != ready) {
// 1. Synchronize on the Class object that represents the class or
// interface to be initialized. This involves waiting until the
@@ -80,13 +80,13 @@
acquire();
mvm::Thread* self = mvm::Thread::get();
- if (status == inClinit) {
+ if (getInitializationState() == inClinit) {
// 2. If initialization by some other thread is in progress for the
// class or interface, then wait on this Class object (which
// temporarily releases the lock). When the current thread awakens
// from the wait, repeat this step.
- if (ownerClass != self) {
- while (ownerClass) {
+ if (getOwnerClass() != self) {
+ while (getOwnerClass()) {
waitClass();
}
} else {
@@ -102,7 +102,7 @@
// 4. If the class or interface has already been initialized, then no
// further action is required. Release the lock on the Class object
// and complete normally.
- if (status == ready) {
+ if (getInitializationState() == ready) {
release();
return;
}
@@ -118,8 +118,8 @@
// 6. Otherwise, record the fact that initialization of the Class object is
// now in progress by the current thread and release the lock on the
// Class object.
- ownerClass = self;
- status = inClinit;
+ setOwnerClass(self);
+ setInitializationState(inClinit);
release();
@@ -145,7 +145,7 @@
if (exc) {
acquire();
status = erroneous;
- ownerClass = 0;
+ setOwnerClass(0);
broadcastClass();
release();
throw exc;
@@ -200,8 +200,8 @@
// threads, release the lock, and complete this procedure normally.
if (!exc) {
acquire();
- status = ready;
- ownerClass = 0;
+ setInitializationState(ready);
+ setOwnerClass(0);
broadcastClass();
release();
return;
@@ -234,7 +234,7 @@
// with reason E or its replacement as determined in the previous step.
acquire();
status = erroneous;
- ownerClass = 0;
+ setOwnerClass(0);
broadcastClass();
release();
throw exc;
@@ -429,7 +429,7 @@
JavaObject* UserCommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) {
acquire();
- if (!(delegatee)) {
+ if (!getDelegatee()) {
UserClass* cl = vm->upcalls->newClass;
JavaObject* delegatee = cl->doNew(vm);
if (!pd) {
@@ -439,10 +439,10 @@
delegatee,
this, pd);
}
- this->delegatee = delegatee;
+ setDelegatee(delegatee);
}
release();
- return delegatee;
+ return getDelegatee();
}
#define PATH_MANIFEST "META-INF/MANIFEST.MF"
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=59136&r1=59135&r2=59136&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Nov 12 08:21:00 2008
@@ -322,7 +322,11 @@
/// waitForExit - Waits that there are no more non-daemon threads in this JVM.
///
virtual void waitForExit();
-
+
+#ifdef ISOLATE
+ uint32 IsolateID;
+#endif
+
};
} // end namespace jnjvm
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmConfig.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmConfig.h?rev=59136&r1=59135&r2=59136&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmConfig.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmConfig.h Wed Nov 12 08:21:00 2008
@@ -33,4 +33,9 @@
#define ISOLATE_STATIC static
#endif
+
+#ifdef ISOLATE
+#define NR_ISOLATES 32
+#endif
+
#endif // JNJVM_CONFIG_H
Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=59136&r1=59135&r2=59136&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Wed Nov 12 08:21:00 2008
@@ -229,7 +229,9 @@
}
} else if (V == module->InitialisationCheckFunction) {
Changed = true;
-
+#ifdef ISOLATE
+ Call.setCalledFunction(module->InitialiseClassFunction);
+#else
BasicBlock* NBB = 0;
if (CI->getParent()->getTerminator() != CI) {
NBB = II->getParent()->splitBasicBlock(II);
@@ -302,6 +304,7 @@
CI->eraseFromParent();
BranchInst::Create(NBB, trueCl);
break;
+#endif
} else if (V == module->GetConstantPoolAtFunction) {
Function* resolver = dyn_cast<Function>(Call.getArgument(0));
assert(resolver && "Wrong use of GetConstantPoolAt");
Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=59136&r1=59135&r2=59136&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Wed Nov 12 08:21:00 2008
@@ -75,8 +75,16 @@
}
}
classLoader->MARK_AND_TRACE;
-#if !defined(ISOLATE)
- delegatee->MARK_AND_TRACE;
+#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+ _delegatee->MARK_AND_TRACE;
+#endif
+
+#if defined(ISOLATE)
+ for (uint32 i =0; i < NR_ISOLATES; ++i) {
+ TaskClassMirror &M = IsolateInfo[i];
+ M.delegatee->MARK_AND_TRACE;
+ M.staticInstance->MARK_AND_TRACE;
+ }
#endif
}
@@ -129,8 +137,16 @@
#endif
traceClassMap(bootstrapLoader->classes);
+#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+#define TRACE_DELEGATEE(prim) \
+ prim->_delegatee->MARK_AND_TRACE
+
+#else
+#if defined(ISOLATE)
#define TRACE_DELEGATEE(prim) \
- prim->delegatee->MARK_AND_TRACE
+ prim->CALL_TRACER;
+#endif
+#endif
TRACE_DELEGATEE(upcalls->OfVoid);
TRACE_DELEGATEE(upcalls->OfBool);
@@ -142,7 +158,7 @@
TRACE_DELEGATEE(upcalls->OfLong);
TRACE_DELEGATEE(upcalls->OfDouble);
#undef TRACE_DELEGATEE
-
+
TRACE_VECTOR(JavaString*, gc_allocator, bootstrapLoader->strings);
if (bootstrapThread) {
More information about the vmkit-commits
mailing list