📄 gthread-jni.c
字号:
return initialized = -1; } mutex_ctor = (*env)->GetMethodID (env, mutex_class, "<init>", "()V"); if ( ! mutex_ctor) { BROKEN (env, "cannot find zero-arg constructor for GThreadMutex"); return initialized = -1; } mutex_potentialLockers_fld = (*env)->GetFieldID (env, mutex_class, "potentialLockers", "I"); if ( ! mutex_class ) { BROKEN (env, "cannot find GThreadMutex.potentialLockers"); return initialized = -1; } if (! (mutex_lockForPotentialLockers_fld = (*env)->GetFieldID (env, mutex_class, "lockForPotentialLockers", "Ljava/lang/Object;"))) { BROKEN (env, "cannot find GThreadMutex.lockForPotentialLockers"); return initialized = -1; } /* java.lang.Thread */ if (! (lcl_class = (*env)->FindClass (env, "java/lang/Thread"))) { BROKEN (env, "cannot find java.lang.Thread"); return initialized = -1; } /* Pin it down. */ thread_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); DELETE_LOCAL_REF (env, lcl_class); if (!thread_class) { BROKEN (env, "Cannot get a global reference to java.lang.Thread"); return initialized = -1; } thread_current_mth = (*env)->GetStaticMethodID (env, thread_class, "currentThread", "()Ljava/lang/Thread;"); if (!thread_current_mth) { BROKEN (env, "cannot find Thread.currentThread() method"); return initialized = -1; } thread_equals_mth = (*env)->GetMethodID (env, thread_class, "equals", "(Ljava/lang/Object;)Z"); if (!thread_equals_mth) { BROKEN (env, "cannot find Thread.equals() method"); return initialized = -1; } thread_join_mth = (*env)->GetMethodID (env, thread_class, "join", "()V"); if (!thread_join_mth) { BROKEN (env, "cannot find Thread.join() method"); return initialized = -1; } thread_stop_mth = (*env)->GetMethodID (env, thread_class, "stop", "()V"); if ( ! thread_stop_mth ) { BROKEN (env, "cannot find Thread.stop() method"); return initialized = -1; } thread_setPriority_mth = (*env)->GetMethodID (env, thread_class, "setPriority", "(I)V"); if ( ! thread_setPriority_mth ) { BROKEN (env, "cannot find Thread.setPriority() method"); return initialized = -1; } thread_yield_mth = (*env)->GetStaticMethodID (env, thread_class, "yield", "()V"); if ( ! thread_yield_mth ) { BROKEN (env, "cannot find Thread.yield() method"); return initialized = -1; } /* java.lang.ThreadLocal */ lcl_class = (*env)->FindClass (env, "java/lang/ThreadLocal"); if ( ! lcl_class ) { BROKEN (env, "cannot find class java.lang.ThreadLocal"); return initialized = -1; } /* Pin it down. */ threadlocal_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); DELETE_LOCAL_REF (env, lcl_class); if ( ! threadlocal_class ) { BROKEN (env, "Cannot get a global reference to java.lang.ThreadLocal"); return initialized = -1; } threadlocal_ctor = (*env)->GetMethodID (env, threadlocal_class, "<init>", "()V"); if ( ! threadlocal_ctor ) { BROKEN (env, "cannot find ThreadLocal.<init>()V"); return initialized = -1; } threadlocal_get_mth = (*env)->GetMethodID (env, threadlocal_class, "get", "()Ljava/lang/Object;"); if ( ! threadlocal_get_mth ) { BROKEN (env, "cannot find java.lang.ThreadLocal.get()Object"); return initialized = -1; } threadlocal_set_mth = (*env)->GetMethodID (env, threadlocal_class, "set", "(Ljava/lang/Object;)V"); if ( ! threadlocal_set_mth ) { BROKEN (env, "cannot find ThreadLocal.set(Object)V"); return initialized = -1; } /* java.lang.Long */ lcl_class = (*env)->FindClass (env, "java/lang/Long"); if ( ! lcl_class ) { BROKEN (env, "cannot find class java.lang.Long"); return initialized = -1; } /* Pin it down. */ long_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); DELETE_LOCAL_REF (env, lcl_class); if (!long_class) { BROKEN (env, "Cannot get a global reference to java.lang.Long"); return initialized = -1; } long_ctor = (*env)->GetMethodID (env, long_class, "<init>", "(J)V"); if (!long_ctor) { BROKEN (env, "cannot find method java.lang.Long.<init>(J)V"); return initialized = -1; } long_longValue_mth = (*env)->GetMethodID (env, long_class, "longValue", "()J"); if (!long_longValue_mth) { BROKEN (env, "cannot find method java.lang.Long.longValue()J"); return initialized = -1; } /* GThreadNativeMethodRunner */ lcl_class = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GThreadNativeMethodRunner"); if ( ! lcl_class ) { BROKEN (env, "cannot find gnu.java.awt.peer.gtk.GThreadNativeMethodRunner"); return initialized = -1; } /* Pin it down. */ runner_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); DELETE_LOCAL_REF (env, lcl_class); if (!runner_class) { BROKEN (env, "Cannot get a global reference to the class GThreadNativeMethodRunner"); return initialized = -1; } runner_ctor = (*env)->GetMethodID (env, runner_class, "<init>", "(JJZ)V"); if ( ! runner_ctor ) { BROKEN (env, "cannot find method GThreadNativeMethodRunner.<init>(JJZ)"); return initialized = -1; } runner_start_mth = (*env)->GetMethodID (env, runner_class, "start", "()V"); if ( ! runner_start_mth ) { BROKEN (env, "cannot find method GThreadNativeMethodRunner.start()V"); return initialized = -1; } runner_threadToThreadID_mth = (*env)->GetStaticMethodID (env, runner_class, "threadToThreadID", "(Ljava/lang/Thread;)I"); if ( ! runner_threadToThreadID_mth ) { BROKEN (env, "cannot find method GThreadNativeMethodRunner.threadToThreadID(java.lang.Thread)I"); return initialized = -1; } runner_threadIDToThread_mth = (*env)->GetStaticMethodID (env, runner_class, "threadIDToThread", "(I)Ljava/lang/Thread;"); if ( ! runner_threadIDToThread_mth ) { BROKEN (env, "cannot find method GThreadNativeMethodRunner.threadIDToThread(I)java.lang.Thread"); return initialized = -1; } runner_deRegisterJoinable_mth = (*env)->GetStaticMethodID (env, runner_class, "deRegisterJoinable", "(Ljava/lang/Thread;)V"); if (!runner_deRegisterJoinable_mth) { BROKEN (env, "cannot find method GThreadNativeMethodRunner.deRegisterJoinable(java.lang.Thread)V"); return initialized = -1; } /* java.lang.InterruptedException */ lcl_class = (*env)->FindClass (env, "java/lang/InterruptedException"); if ( ! lcl_class ) { BROKEN (env, "cannot find class java.lang.InterruptedException"); return initialized = -1; } /* Pin it down. */ interrupted_exception_class = (jclass) (*env)->NewGlobalRef (env, lcl_class); DELETE_LOCAL_REF (env, lcl_class); if (!interrupted_exception_class) { BROKEN (env, "Cannot make a global reference" " to java.lang.InterruptedException"); return initialized = -1; }#ifdef JNI_VERSION_1_2 if (HAVE_JNI_VERSION_1_2) assert ( ! (*env)->ExceptionCheck (env)); else#endif assert ( ! (*env)->ExceptionOccurred (env)); return initialized = 1;}/************************************************************************//* Utilities to allocate and free java.lang.Objects *//************************************************************************//* The condition variables are java.lang.Object objects, * which this method allocates and returns a global ref. Note that global * refs must be explicitly freed (isn't C fun?). */static jobjectallocatePlainObject (JNIEnv * env){ jobject lcl_obj, global_obj; lcl_obj = (*env)->NewObject (env, obj_class, obj_ctor); if (!lcl_obj) { BROKEN (env, "cannot allocate object"); return NULL; } global_obj = (*env)->NewGlobalRef (env, lcl_obj); DELETE_LOCAL_REF (env, lcl_obj); if (!global_obj) { NEW_BROKEN (env, "cannot make global ref for a new plain Java object"); /* Deliberate fall-through */ } return global_obj;}/* Frees any Java object given a global ref (isn't C fun?) */static voidfreeObject (JNIEnv * env, jobject obj){ if (obj) { (*env)->DeleteGlobalRef (env, obj); /* DeleteGlobalRef can never fail */ }}/************************************************************************//* Utilities to allocate and free Java mutexes *//************************************************************************//* The mutexes are gnu.java.awt.peer.gtk.GThreadMutex objects, * which this method allocates and returns a global ref. Note that global * refs must be explicitly freed (isn't C fun?). * * Free this with freeObject() */static jobjectallocateMutexObject (JNIEnv * env){ jobject lcl_obj, global_obj; lcl_obj = (*env)->NewObject (env, mutex_class, mutex_ctor); if (!lcl_obj) { BROKEN (env, "cannot allocate a GThreadMutex"); return NULL; } global_obj = (*env)->NewGlobalRef (env, lcl_obj); DELETE_LOCAL_REF (env, lcl_obj); if (!global_obj) { NEW_BROKEN (env, "cannot make global ref"); /* Deliberate fallthrough */ } return global_obj;}/************************************************************************//* Locking code *//************************************************************************//* Lock a Java object */#define ENTER_MONITOR(env, m) \ enterMonitor(env, m, G_STRINGIFY(m))/* Return -1 on failure, 0 on success. */static intenterMonitor (JNIEnv * env, jobject monitorObj, const char monName[]){ if (TRACE_MONITORS) tracing (" <MonitorEnter(%s)>", monName); assert (monitorObj); if ((*env)->MonitorEnter (env, monitorObj) < 0) { BROKEN (env, "cannot enter monitor"); return -1; } return 0;}/* Unlock a Java object */#define EXIT_MONITOR(env, m) \ exitMonitor(env, m, G_STRINGIFY(m))static intexitMonitor (JNIEnv * env, jobject mutexObj, const char monName[]){ if (TRACE_MONITORS) tracing (" <MonitorExit(%s)>", monName); assert (mutexObj); if ((*env)->MonitorExit (env, mutexObj) < 0) { BROKEN (env, "cannot exit monitor "); return -1; } return 0;}/************************************************************************//* Miscellaneous utilities *//************************************************************************//* Get the Java Thread object that corresponds to a particular thread ID. A negative thread Id gives us a null object. Returns a local reference. */static jobjectgetThreadFromThreadID (JNIEnv * env, gpointer gThreadID){ jint threadNum = (jint) gThreadID; jobject thread; if (threadNum < 0) { NEW_BROKEN (env, "getThreadFromThreadID asked to look up" " a negative thread index"); return NULL; } thread = (*env)->CallStaticObjectMethod (env, runner_class, runner_threadIDToThread_mth, threadNum); if (MAYBE_BROKEN (env, "cannot get Thread for threadID ")) return NULL; return thread;}/** Return the unique threadID of THREAD. Error handling: Return (gpointer) -1 on all failures, and propagate an exception. */static gpointergetThreadIDFromThread (JNIEnv * env, jobject thread){ jint threadNum; if (ENABLE_EXPENSIVE_ASSERTIONS) assert ((*env)->IsInstanceOf (env, thread, thread_class)); HIDE_OLD_TROUBLE (env);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -