[vmkit-commits] [vmkit] r84112 - in /vmkit/trunk/lib/N3: Mono/Mono.cpp VMCore/CLIJit.cpp VMCore/VMObject.cpp VMCore/VMObject.h
Gael Thomas
gael.thomas at lip6.fr
Wed Oct 14 09:51:22 PDT 2009
Author: gthomas
Date: Wed Oct 14 11:51:21 2009
New Revision: 84112
URL: http://llvm.org/viewvc/llvm-project?rev=84112&view=rev
Log:
All access to VMObject::lockObj are safe (use llvm_gcroot)
Modified:
vmkit/trunk/lib/N3/Mono/Mono.cpp
vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
vmkit/trunk/lib/N3/VMCore/VMObject.cpp
vmkit/trunk/lib/N3/VMCore/VMObject.h
Modified: vmkit/trunk/lib/N3/Mono/Mono.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/Mono.cpp?rev=84112&r1=84111&r2=84112&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/Mono/Mono.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/Mono.cpp Wed Oct 14 11:51:21 2009
@@ -119,7 +119,7 @@
extern "C" void System_Threading_Monitor_Monitor_exit(VMObject* obj) {
// TODO: There's a bug in the bootstrap, see why
- if (obj->lockObj->owner()) obj->unlock();
+ if (LockObj::owner(obj->lockObj)) obj->unlock();
}
extern "C" bool System_Threading_Monitor_Monitor_try_enter(VMObject* obj, int ms) {
Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=84112&r1=84111&r2=84112&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Wed Oct 14 11:51:21 2009
@@ -240,7 +240,7 @@
#endif
#define CASE_ARRAY(name, elmt, nbb, printer, pre, sep, post) \
- if(cl->baseClass == MSCorlib::p##name) { \
+ if(cl->baseClass == MSCorlib::p##name) { \
((void**)res)[VT_PRINT_OFFSET] = ((void **)(unsigned int)Array##name::do_print); \
} else
Modified: vmkit/trunk/lib/N3/VMCore/VMObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.cpp?rev=84112&r1=84111&r2=84112&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.cpp Wed Oct 14 11:51:21 2009
@@ -45,14 +45,11 @@
return sizeof(N3VirtualTable) / sizeof(uintptr_t);
}
-void VMObject::initialise(VMCommonClass* cl) {
- this->classOf = cl;
- this->lockObj = 0;
-}
-
LockObj* LockObj::allocate() {
- LockObj* res = new(&_VT) LockObj();
+ declare_gcroot(LockObj*, res) = new(&_VT) LockObj();
+ res->threads = new std::vector<VMThread*>();
+ res->lock = new mvm::LockRecursive();
return res;
}
@@ -63,11 +60,14 @@
void LockObj::_destroy(LockObj *self) {
llvm_gcroot(self, 0);
+ delete self->threads;
+ delete self->lock;
}
-void LockObj::notify() {
- for (std::vector<VMThread*>::iterator i = threads.begin(),
- e = threads.end(); i!= e; ++i) {
+void LockObj::notify(LockObj *self) {
+ llvm_gcroot(self, 0);
+ for (std::vector<VMThread*>::iterator i = self->threads->begin(),
+ e = self->threads->end(); i!= e; ++i) {
VMThread* cur = *i;
cur->lock->lock();
if (cur->interruptFlag != 0) {
@@ -78,50 +78,61 @@
if (th != 0) {
cur->varcond->signal();
cur->lock->unlock();
- threads.erase(i);
+ self->threads->erase(i);
break;
} else { // dead thread
- threads.erase(i);
+ self->threads->erase(i);
}
}
}
}
-void LockObj::notifyAll() {
- for (std::vector<VMThread*>::iterator i = threads.begin(),
- e = threads.end(); i!= e; ++i) {
+void LockObj::notifyAll(LockObj *self) {
+ llvm_gcroot(self, 0);
+ for (std::vector<VMThread*>::iterator i = self->threads->begin(),
+ e = self->threads->end(); i!= e; ++i) {
VMThread* cur = *i;
cur->lock->lock();
cur->varcond->signal();
cur->lock->unlock();
- threads.erase(i);
+ self->threads->erase(i);
}
}
-void LockObj::wait(VMThread* th) {
- threads.push_back(th);
+void LockObj::wait(LockObj *self, VMThread* th) {
+ llvm_gcroot(self, 0);
+ self->threads->push_back(th);
}
-void LockObj::remove(VMThread* th) {
- for (std::vector<VMThread*>::iterator i = threads.begin(),
- e = threads.end(); i!= e; ++i) {
+void LockObj::remove(LockObj *self, VMThread* th) {
+ llvm_gcroot(self, 0);
+ for (std::vector<VMThread*>::iterator i = self->threads->begin(),
+ e = self->threads->end(); i!= e; ++i) {
if (*i == th) {
- threads.erase(i);
+ self->threads->erase(i);
break;
}
}
}
-void LockObj::aquire() {
- lock.lock();
+void LockObj::aquire(LockObj *self) {
+ llvm_gcroot(self, 0);
+ self->lock->lock();
+}
+
+void LockObj::release(LockObj *self) {
+ llvm_gcroot(self, 0);
+ self->lock->unlock();
}
-void LockObj::release() {
- lock.unlock();
+bool LockObj::owner(LockObj *self) {
+ llvm_gcroot(self, 0);
+ return self->lock->selfOwner();
}
-bool LockObj::owner() {
- return lock.selfOwner();
+void VMObject::initialise(VMCommonClass* cl) {
+ this->classOf = cl;
+ this->lockObj = 0;
}
void VMObject::_print(const VMObject *self, mvm::PrintBuffer* buf) {
@@ -134,29 +145,35 @@
}
static LockObj* myLock(VMObject* obj) {
+ llvm_gcroot(obj, 0);
verifyNull(obj);
- if (obj->lockObj == 0) {
+ declare_gcroot(LockObj*, lock) = obj->lockObj;
+ if (lock == 0) {
VMObject::globalLock->lock();
- if (obj->lockObj == 0) {
- obj->lockObj = LockObj::allocate();
+ lock = obj->lockObj;
+ if (lock == 0) {
+ lock = LockObj::allocate();
+ obj->lockObj = lock;
}
VMObject::globalLock->unlock();
}
- return obj->lockObj;
+ return lock;
}
void VMObject::aquire() {
- myLock(this)->aquire();
+ declare_gcroot(LockObj*, lock) = myLock(this);
+ LockObj::aquire(lock);
}
void VMObject::unlock() {
verifyNull(this);
- lockObj->release();
+ declare_gcroot(LockObj*, lock) = myLock(this);
+ LockObj::release(lock);
}
void VMObject::waitIntern(struct timeval* info, bool timed) {
- LockObj * l = myLock(this);
- bool owner = l->owner();
+ declare_gcroot(LockObj *, l) = myLock(this);
+ bool owner = LockObj::owner(l);
if (owner) {
VMThread* thread = VMThread::get();
@@ -169,10 +186,10 @@
thread->interruptFlag = 0;
thread->getVM()->interruptedException(this);
} else {
- unsigned int recur = l->lock.recursionCount();
+ unsigned int recur = l->lock->recursionCount();
bool timeout = false;
- l->lock.unlockAll();
- l->wait(thread);
+ l->lock->unlockAll();
+ LockObj::wait(l, thread);
thread->state = VMThread::StateWaiting;
if (timed) {
@@ -183,10 +200,10 @@
bool interrupted = (thread->interruptFlag != 0);
mutexThread->unlock();
- l->lock.lockAll(recur);
+ l->lock->lockAll(recur);
if (interrupted || timeout) {
- l->remove(thread);
+ LockObj::remove(l, thread);
}
thread->state = VMThread::StateRunning;
@@ -210,18 +227,18 @@
}
void VMObject::notify() {
- LockObj* l = myLock(this);
- if (l->owner()) {
- l->notify();
+ declare_gcroot(LockObj*, l) = myLock(this);
+ if (LockObj::owner(l)) {
+ LockObj::notify(l);
} else {
VMThread::get()->getVM()->illegalMonitorStateException(this);
}
}
void VMObject::notifyAll() {
- LockObj* l = myLock(this);
- if (l->owner()) {
- l->notifyAll();
+ declare_gcroot(LockObj*, l) = myLock(this);
+ if (LockObj::owner(l)) {
+ LockObj::notifyAll(l);
} else {
VMThread::get()->getVM()->illegalMonitorStateException(this);
}
Modified: vmkit/trunk/lib/N3/VMCore/VMObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.h?rev=84112&r1=84111&r2=84112&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.h Wed Oct 14 11:51:21 2009
@@ -46,22 +46,21 @@
class LockObj : public mvm::Object {
public:
static N3VirtualTable _VT;
- mvm::LockRecursive lock;
- std::vector<VMThread*> threads;
+ mvm::LockRecursive *lock;
+ std::vector<VMThread*> *threads;
static LockObj* allocate();
-
static void _destroy(LockObj *);
static void _print(const LockObj *, mvm::PrintBuffer *);
- void notify();
- void notifyAll();
- void wait(VMThread* th);
- void remove(VMThread* th);
-
- void aquire();
- void release();
- bool owner();
+ static void notify(LockObj*);
+ static void notifyAll(LockObj*);
+ static void wait(LockObj*, VMThread* th);
+ static void remove(LockObj*, VMThread* th);
+
+ static void aquire(LockObj*);
+ static void release(LockObj*);
+ static bool owner(LockObj*);
};
#define VALUE_OFFSET 3
@@ -69,7 +68,7 @@
class VMObject : public mvm::Object {
public:
VMCommonClass* classOf;
- LockObj* lockObj;
+ LockObj* lockObj;
static mvm::Lock* globalLock;
static const llvm::Type* llvmType;
More information about the vmkit-commits
mailing list