mirror of
https://github.com/corda/corda.git
synced 2025-01-16 17:59:46 +00:00
implement Processor::makeLocalReference()/disposeLocalReference()
This commit is contained in:
parent
8ae36c05b7
commit
a73f474f34
@ -159,11 +159,13 @@ class MyThread: public Thread {
|
|||||||
MyThread(Machine* m, object javaThread, vm::Thread* parent):
|
MyThread(Machine* m, object javaThread, vm::Thread* parent):
|
||||||
vm::Thread(m, javaThread, parent),
|
vm::Thread(m, javaThread, parent),
|
||||||
argumentList(0),
|
argumentList(0),
|
||||||
frame(0)
|
frame(0),
|
||||||
|
reference(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
ArgumentList* argumentList;
|
ArgumentList* argumentList;
|
||||||
void* frame;
|
void* frame;
|
||||||
|
Reference* reference;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
@ -2023,11 +2025,15 @@ invoke(Thread* thread, object method, ArgumentList* arguments)
|
|||||||
unsigned returnType = fieldType(t, returnCode);
|
unsigned returnType = fieldType(t, returnCode);
|
||||||
|
|
||||||
void* frame = t->frame;
|
void* frame = t->frame;
|
||||||
|
Reference* reference = t->reference;
|
||||||
|
|
||||||
uint64_t result = vmInvoke
|
uint64_t result = vmInvoke
|
||||||
(&compiledBody(t, methodCompiled(t, method), 0), arguments->array,
|
(&compiledBody(t, methodCompiled(t, method), 0), arguments->array,
|
||||||
arguments->position * BytesPerWord, returnType);
|
arguments->position * BytesPerWord, returnType);
|
||||||
|
|
||||||
|
while (t->reference != reference) {
|
||||||
|
dispose(t, t->reference);
|
||||||
|
}
|
||||||
t->frame = frame;
|
t->frame = frame;
|
||||||
|
|
||||||
object r;
|
object r;
|
||||||
@ -2187,15 +2193,26 @@ class MyProcessor: public Processor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual object*
|
virtual object*
|
||||||
makeLocalReference(Thread* t, object)
|
makeLocalReference(Thread* vmt, object o)
|
||||||
{
|
{
|
||||||
abort(t);
|
if (o) {
|
||||||
|
MyThread* t = static_cast<MyThread*>(vmt);
|
||||||
|
|
||||||
|
Reference* r = new (t->m->system->allocate(sizeof(Reference)))
|
||||||
|
Reference(o, &(t->reference));
|
||||||
|
|
||||||
|
return &(r->target);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void
|
virtual void
|
||||||
disposeLocalReference(Thread* t, object*)
|
disposeLocalReference(Thread* t, object* r)
|
||||||
{
|
{
|
||||||
abort(t);
|
if (r) {
|
||||||
|
vm::dispose(t, reinterpret_cast<Reference*>(r));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual object
|
virtual object
|
||||||
|
@ -1015,26 +1015,25 @@ NewGlobalRef(Thread* t, jobject o)
|
|||||||
|
|
||||||
ACQUIRE(t, t->m->referenceLock);
|
ACQUIRE(t, t->m->referenceLock);
|
||||||
|
|
||||||
t->m->jniReferences = new (t->m->system->allocate(sizeof(Reference)))
|
if (o) {
|
||||||
Reference(*o, t->m->jniReferences);
|
Reference* r = new (t->m->system->allocate(sizeof(Reference)))
|
||||||
|
Reference(*o, &(t->m->jniReferences));
|
||||||
|
|
||||||
return &(t->m->jniReferences->target);
|
return &(r->target);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JNICALL
|
void JNICALL
|
||||||
DeleteGlobalRef(Thread* t, jobject o)
|
DeleteGlobalRef(Thread* t, jobject r)
|
||||||
{
|
{
|
||||||
ENTER(t, Thread::ActiveState);
|
ENTER(t, Thread::ActiveState);
|
||||||
|
|
||||||
ACQUIRE(t, t->m->referenceLock);
|
ACQUIRE(t, t->m->referenceLock);
|
||||||
|
|
||||||
for (Reference** r = &(t->m->jniReferences); *r;) {
|
if (r) {
|
||||||
if (&((*r)->target) == o) {
|
dispose(t, reinterpret_cast<Reference*>(r));
|
||||||
*r = (*r)->next;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
r = &((*r)->next);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1076,13 +1076,20 @@ noop();
|
|||||||
|
|
||||||
class Reference {
|
class Reference {
|
||||||
public:
|
public:
|
||||||
Reference(object target, Reference* next):
|
Reference(object target, Reference** handle):
|
||||||
target(target),
|
target(target),
|
||||||
next(next)
|
next(*handle),
|
||||||
{ }
|
handle(handle)
|
||||||
|
{
|
||||||
|
if (next) {
|
||||||
|
next->handle = &next;
|
||||||
|
}
|
||||||
|
*handle = this;
|
||||||
|
}
|
||||||
|
|
||||||
object target;
|
object target;
|
||||||
Reference* next;
|
Reference* next;
|
||||||
|
Reference** handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Machine {
|
class Machine {
|
||||||
@ -1255,6 +1262,13 @@ class StateResource {
|
|||||||
Thread::State oldState;
|
Thread::State oldState;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline void
|
||||||
|
dispose(Thread* t, Reference* r)
|
||||||
|
{
|
||||||
|
*(r->handle) = r->next;
|
||||||
|
t->m->system->free(r);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
collect(Thread* t, Heap::CollectionType type);
|
collect(Thread* t, Heap::CollectionType type);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user