⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gthread-jni.c

📁 Mac OS X 10.4.9 for x86 Source Code gcc 实现源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
      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 + -