mirror of
https://github.com/corda/corda.git
synced 2024-12-29 09:18:58 +00:00
implement/update ACQUIRE and ACQUIRE_RAW macros; refine set() implementation
This commit is contained in:
parent
375715fb72
commit
f5cb9b3bf1
@ -1,8 +1,6 @@
|
|||||||
#ifndef HEAP_H
|
#ifndef HEAP_H
|
||||||
#define HEAP_H
|
#define HEAP_H
|
||||||
|
|
||||||
#include "system.h"
|
|
||||||
|
|
||||||
class Heap {
|
class Heap {
|
||||||
public:
|
public:
|
||||||
enum CollectionType {
|
enum CollectionType {
|
||||||
@ -24,7 +22,8 @@ class Heap {
|
|||||||
|
|
||||||
virtual ~Heap() { }
|
virtual ~Heap() { }
|
||||||
virtual void collect(CollectionType type, Iterator* it) = 0;
|
virtual void collect(CollectionType type, Iterator* it) = 0;
|
||||||
virtual void check(void** p, System::Monitor* lock) = 0;
|
virtual bool isTenured(void** p) = 0;
|
||||||
|
virtual bool markTenured(void** p);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif//HEAP_H
|
#endif//HEAP_H
|
||||||
|
11
src/system.h
11
src/system.h
@ -16,11 +16,12 @@ class System {
|
|||||||
class Monitor {
|
class Monitor {
|
||||||
public:
|
public:
|
||||||
virtual ~Monitor() { }
|
virtual ~Monitor() { }
|
||||||
virtual void acquire() = 0;
|
virtual bool tryAcquire(void* id) = 0;
|
||||||
virtual void release() = 0;
|
virtual void acquire(void* id) = 0;
|
||||||
virtual void wait() = 0;
|
virtual void release(void* id) = 0;
|
||||||
virtual void notify() = 0;
|
virtual void wait(void* id) = 0;
|
||||||
virtual void notifyAll() = 0;
|
virtual void notify(void* id) = 0;
|
||||||
|
virtual void notifyAll(void* id) = 0;
|
||||||
virtual void dispose() = 0;
|
virtual void dispose() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
50
src/vm.cpp
50
src/vm.cpp
@ -6,7 +6,8 @@
|
|||||||
#define PROTECT(thread, name) \
|
#define PROTECT(thread, name) \
|
||||||
Thread::Protector MAKE_NAME(protector_) (thread, &name);
|
Thread::Protector MAKE_NAME(protector_) (thread, &name);
|
||||||
|
|
||||||
#define ACQUIRE_MONITOR(x) MonitorResource MAKE_NAME(monitorResource_) (x)
|
#define ACQUIRE(t, x) MonitorResource MAKE_NAME(monitorResource_) (t, x)
|
||||||
|
#define ACQUIRE_RAW(t, x) RawMonitorResource MAKE_NAME(monitorResource_) (t, x)
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@ -92,12 +93,35 @@ class Thread {
|
|||||||
Protector* protector;
|
Protector* protector;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void enter(Thread* t, Thread::State state);
|
||||||
|
|
||||||
class MonitorResource {
|
class MonitorResource {
|
||||||
public:
|
public:
|
||||||
MonitorResource(System::Monitor* m): m(m) { m->acquire(); }
|
MonitorResource(Thread* t, System::Monitor* m): t(t), m(m) {
|
||||||
~MonitorResource() { m->release(); }
|
if (not m->tryAcquire(t)) {
|
||||||
|
enter(t, Thread::IdleState);
|
||||||
|
m->acquire(t);
|
||||||
|
enter(t, Thread::ActiveState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~MonitorResource() { m->release(t); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Thread* t;
|
||||||
|
System::Monitor* m;
|
||||||
|
};
|
||||||
|
|
||||||
|
class RawMonitorResource {
|
||||||
|
public:
|
||||||
|
RawMonitorResource(Thread* t, System::Monitor* m): t(t), m(m) {
|
||||||
|
m->acquire(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
~RawMonitorResource() { m->release(t); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
Thread* t;
|
||||||
System::Monitor* m;
|
System::Monitor* m;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -134,6 +158,7 @@ dispose(Machine* m)
|
|||||||
{
|
{
|
||||||
m->stateLock->dispose();
|
m->stateLock->dispose();
|
||||||
m->heapLock->dispose();
|
m->heapLock->dispose();
|
||||||
|
m->classLock->dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -195,7 +220,7 @@ enter(Thread* t, Thread::State s)
|
|||||||
{
|
{
|
||||||
if (s == t->state) return;
|
if (s == t->state) return;
|
||||||
|
|
||||||
ACQUIRE_MONITOR(t->vm->stateLock);
|
ACQUIRE_RAW(t, t->vm->stateLock);
|
||||||
|
|
||||||
switch (s) {
|
switch (s) {
|
||||||
case Thread::ExclusiveState: {
|
case Thread::ExclusiveState: {
|
||||||
@ -211,7 +236,7 @@ enter(Thread* t, Thread::State s)
|
|||||||
t->vm->exclusive = t;
|
t->vm->exclusive = t;
|
||||||
|
|
||||||
while (t->vm->activeCount > 1) {
|
while (t->vm->activeCount > 1) {
|
||||||
t->vm->stateLock->wait();
|
t->vm->stateLock->wait(t);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@ -234,7 +259,7 @@ enter(Thread* t, Thread::State s)
|
|||||||
}
|
}
|
||||||
t->state = s;
|
t->state = s;
|
||||||
|
|
||||||
t->vm->stateLock->notifyAll();
|
t->vm->stateLock->notifyAll(t);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Thread::ActiveState: {
|
case Thread::ActiveState: {
|
||||||
@ -245,13 +270,13 @@ enter(Thread* t, Thread::State s)
|
|||||||
t->state = s;
|
t->state = s;
|
||||||
t->vm->exclusive = 0;
|
t->vm->exclusive = 0;
|
||||||
|
|
||||||
t->vm->stateLock->notifyAll();
|
t->vm->stateLock->notifyAll(t);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Thread::NoState:
|
case Thread::NoState:
|
||||||
case Thread::IdleState: {
|
case Thread::IdleState: {
|
||||||
while (t->vm->exclusive) {
|
while (t->vm->exclusive) {
|
||||||
t->vm->stateLock->wait();
|
t->vm->stateLock->wait(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
++ t->vm->activeCount;
|
++ t->vm->activeCount;
|
||||||
@ -281,7 +306,7 @@ enter(Thread* t, Thread::State s)
|
|||||||
t->state = s;
|
t->state = s;
|
||||||
|
|
||||||
while (t->vm->liveCount > 1) {
|
while (t->vm->liveCount > 1) {
|
||||||
t->vm->stateLock->wait();
|
t->vm->stateLock->wait(t);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@ -297,7 +322,7 @@ maybeYieldAndMaybeCollect(Thread* t, unsigned size)
|
|||||||
abort(t);
|
abort(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
ACQUIRE_MONITOR(t->vm->stateLock);
|
ACQUIRE_RAW(t, t->vm->stateLock);
|
||||||
|
|
||||||
while (t->vm->exclusive) {
|
while (t->vm->exclusive) {
|
||||||
// another thread wants to enter the exclusive state, either for a
|
// another thread wants to enter the exclusive state, either for a
|
||||||
@ -331,7 +356,10 @@ inline void
|
|||||||
set(Thread* t, object& target, object value)
|
set(Thread* t, object& target, object value)
|
||||||
{
|
{
|
||||||
target = value;
|
target = value;
|
||||||
t->vm->heap->check(&target, t->vm->heapLock);
|
if (t->vm->heap->isTenured(&target)) {
|
||||||
|
ACQUIRE(t, t->vm->heapLock);
|
||||||
|
t->vm->heap->markTenured(&target);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
|
Loading…
Reference in New Issue
Block a user