various fixes to get Eclipse 3.6 working

* add libnet.so and libnio.so to built-in libraries for openjdk-src build

 * implement sun.misc.Unsafe.park/unpark

 * implement JVM_SetClassSigners/JVM_GetClassSigners

 * etc.
This commit is contained in:
Joel Dice
2010-11-27 11:25:02 -07:00
parent 459f4d5194
commit e68dfe1e89
8 changed files with 198 additions and 17 deletions

View File

@ -64,6 +64,7 @@ typedef int socklen_t;
# include <fcntl.h>
# include <errno.h>
# include <sched.h>
# include <dlfcn.h>
# define OPEN open
# define CLOSE close
@ -244,6 +245,22 @@ class MyClasspath : public Classpath {
sb.append(SO_SUFFIX);
sb.append('\0');
this->netLibrary = sb.pointer;
sb.append(this->libraryPath);
sb.append("/");
sb.append(SO_PREFIX);
sb.append("net");
sb.append(SO_SUFFIX);
sb.append('\0');
this->nioLibrary = sb.pointer;
sb.append(this->libraryPath);
sb.append("/");
sb.append(SO_PREFIX);
sb.append("nio");
sb.append(SO_SUFFIX);
sb.append('\0');
this->tzMappings = sb.pointer;
sb.append(javaHome);
sb.append("/lib/tzmappings");
@ -414,6 +431,8 @@ class MyClasspath : public Classpath {
const char* classpath;
const char* libraryPath;
const char* zipLibrary;
const char* netLibrary;
const char* nioLibrary;
const char* tzMappings;
const char* embedPrefix;
unsigned tzMappingsLength;
@ -561,7 +580,10 @@ getFileAttributes
stringChars(t, path, RUNTIME_ARRAY_BODY(p));
replace('\\', '/', RUNTIME_ARRAY_BODY(p));
if (pathEqual(cp->zipLibrary, RUNTIME_ARRAY_BODY(p))) {
if (pathEqual(cp->zipLibrary, RUNTIME_ARRAY_BODY(p))
or pathEqual(cp->netLibrary, RUNTIME_ARRAY_BODY(p))
or pathEqual(cp->nioLibrary, RUNTIME_ARRAY_BODY(p)))
{
return Exists | Regular;
} else {
EmbeddedFile ef(cp, RUNTIME_ARRAY_BODY(p), stringLength(t, path));
@ -1665,6 +1687,41 @@ Avian_sun_misc_Unsafe_ensureClassInitialized
initClass(t, jclassVmClass(t, reinterpret_cast<object>(arguments[1])));
}
extern "C" JNIEXPORT void JNICALL
Avian_sun_misc_Unsafe_unpark
(Thread* t, object, uintptr_t* arguments)
{
object thread = reinterpret_cast<object>(arguments[1]);
monitorAcquire(t, local::interruptLock(t, thread));
threadUnparked(t, thread) = true;
monitorNotify(t, local::interruptLock(t, thread));
monitorRelease(t, local::interruptLock(t, thread));
}
extern "C" JNIEXPORT void JNICALL
Avian_sun_misc_Unsafe_park
(Thread* t, object, uintptr_t* arguments)
{
bool absolute = arguments[1];
int64_t time; memcpy(&time, arguments + 2, 8);
if (absolute) {
time -= t->m->system->now();
}
if (time <= 0) {
return;
}
monitorAcquire(t, local::interruptLock(t, t->javaThread));
while (not (threadUnparked(t, t->javaThread)
or monitorWait(t, local::interruptLock(t, t->javaThread), time)))
{ }
threadUnparked(t, t->javaThread) = false;
monitorRelease(t, local::interruptLock(t, t->javaThread));
}
extern "C" JNIEXPORT jint JNICALL
EXPORT(JVM_GetInterfaceVersion)()
{
@ -1879,7 +1936,13 @@ EXPORT(JVM_MaxMemory)()
}
extern "C" JNIEXPORT jint JNICALL
EXPORT(JVM_ActiveProcessorCount)(void) { abort(); }
EXPORT(JVM_ActiveProcessorCount)()
{
return 1;
}
extern "C" JNIEXPORT jint JNICALL
net_JNI_OnLoad(JavaVM*, void*);
extern "C" JNIEXPORT void* JNICALL
EXPORT(JVM_LoadLibrary)(const char* path)
@ -1892,9 +1955,18 @@ EXPORT(JVM_LoadLibrary)(const char* path)
#ifdef AVIAN_OPENJDK_SRC
if (local::pathEqual
(static_cast<local::MyClasspath*>(t->m->classpath)->zipLibrary,
RUNTIME_ARRAY_BODY(p))
or local::pathEqual
(static_cast<local::MyClasspath*>(t->m->classpath)->nioLibrary,
RUNTIME_ARRAY_BODY(p)))
{
return t->m->libraries;
} else if (local::pathEqual
(static_cast<local::MyClasspath*>(t->m->classpath)->netLibrary,
RUNTIME_ARRAY_BODY(p)))
{
net_JNI_OnLoad(t->m, 0);
return t->m->libraries;
}
#endif // AVIAN_OPENJDK_SRC
@ -1915,6 +1987,10 @@ EXPORT(JVM_FindLibraryEntry)(void* library, const char* name)
ENTER(t, Thread::ActiveState);
if (library == 0) {
library = t->m->libraries;
}
return static_cast<System::Library*>(library)->resolve(name);
}
@ -2411,10 +2487,25 @@ EXPORT(JVM_IsInterface)(Thread* t, jclass c)
}
extern "C" JNIEXPORT jobjectArray JNICALL
EXPORT(JVM_GetClassSigners)(Thread*, jclass) { abort(); }
EXPORT(JVM_GetClassSigners)(Thread* t, jclass c)
{
ENTER(t, Thread::ActiveState);
object runtimeData = getClassRuntimeDataIfExists(t, jclassVmClass(t, *c));
return runtimeData ? makeLocalReference
(t, classRuntimeDataSigners(t, runtimeData)) : 0;
}
extern "C" JNIEXPORT void JNICALL
EXPORT(JVM_SetClassSigners)(Thread*, jclass, jobjectArray) { abort(); }
EXPORT(JVM_SetClassSigners)(Thread* t, jclass c, jobjectArray signers)
{
ENTER(t, Thread::ActiveState);
object runtimeData = getClassRuntimeData(t, jclassVmClass(t, *c));
set(t, runtimeData, ClassRuntimeDataSigners, *signers);
}
extern "C" JNIEXPORT jobject JNICALL
EXPORT(JVM_GetProtectionDomain)(Thread* t, jclass)

View File

@ -2625,7 +2625,7 @@ throw_(MyThread* t, object o)
(t, Machine::NullPointerExceptionType);
}
// printTrace(t, t->exception);
// printTrace(t, t->exception);
unwind(t);
}
@ -7178,7 +7178,7 @@ class SegFaultHandler: public System::SignalHandler {
t->exception = root(t, Machine::NullPointerException);
}
printTrace(t, t->exception);
// printTrace(t, t->exception);
object continuation;
findUnwindTarget(t, ip, base, stack, &continuation);

View File

@ -222,7 +222,7 @@ class DataRegion: public System::Region {
}
virtual void dispose() {
allocator->free(this, sizeof(*this));
allocator->free(this, sizeof(*this) + length_);
}
System* s;

View File

@ -1882,9 +1882,6 @@ resolveObjectArrayClass(Thread* t, object loader, object elementClass)
void
removeMonitor(Thread* t, object o)
{
expect(t, t->state == Thread::ExclusiveState
or t->state == Thread::ExitState);
unsigned hash;
if (DebugMonitors) {
hash = objectHash(t, o);
@ -1893,8 +1890,6 @@ removeMonitor(Thread* t, object o)
object m = hashMapRemove
(t, root(t, Machine::MonitorMap), o, objectHash, objectEqual);
expect(t, m);
if (DebugMonitors) {
fprintf(stderr, "dispose monitor %p for object %x\n", m, hash);
}

View File

@ -3061,6 +3061,17 @@ resolveMethod(Thread* t, object method, unsigned index)
object
vectorAppend(Thread*, object, object);
inline object
getClassRuntimeDataIfExists(Thread* t, object c)
{
if (classRuntimeDataIndex(t, c)) {
return vectorBody(t, root(t, Machine::ClassRuntimeDataTable),
classRuntimeDataIndex(t, c) - 1);
} else {
return 0;
}
}
inline object
getClassRuntimeData(Thread* t, object c)
{
@ -3070,7 +3081,7 @@ getClassRuntimeData(Thread* t, object c)
ACQUIRE(t, t->m->classLock);
if (classRuntimeDataIndex(t, c) == 0) {
object runtimeData = makeClassRuntimeData(t, 0, 0, 0);
object runtimeData = makeClassRuntimeData(t, 0, 0, 0, 0);
setRoot(t, Machine::ClassRuntimeDataTable, vectorAppend
(t, root(t, Machine::ClassRuntimeDataTable), runtimeData));

View File

@ -40,7 +40,8 @@
(type classRuntimeData
(object arrayClass)
(object jclass)
(object pool))
(object pool)
(object signers))
(type methodRuntimeData
(object native))
@ -187,6 +188,7 @@
(require object sleepLock)
(require object interruptLock)
(require uint8_t interrupted)
(require uint8_t unparked)
(alias peer uint64_t eetop))
(type threadGroup java/lang/ThreadGroup)