From aaf0766e9f897b2fbce053083d85cb739cb509d2 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 10 Feb 2000 20:31:48 +0000 Subject: natNativeThread.cc: New file. * gnu/gcj/jni/natNativeThread.cc: New file. * gnu/gcj/jni/NativeThread.java: New file. * java/lang/Thread.java (data): Now a RawData. * include/jvm.h (_Jv_GetCurrentJNIEnv, _Jv_SetCurrentJNIEnv): Declare. * Makefile.in: Rebuilt. * Makefile.am (java/lang/Thread.h): New target. (ordinary_java_source_files): Added NativeThread.java. (nat_source_files): Added natNativeThread.cc. * java/lang/natThread.cc: Include (struct natThread): Added `jni_env' field. (_Jv_GetCurrentJNIEnv): New function. (_Jv_SetCurrentJNIEnv): Likewise. (initialize_native): Initialize jni_env. Include RawData.h. * jni.cc (ThreadGroupClass): New define. (_Jv_JNI_InvokeFunctions): New structure. (JNI_GetCreatedJavaVMs): New function. (the_vm): New global. (JNI_GetDefaultJavaVMInitArgs): New function. Include NativeThread.h. (NativeThreadClass): New define. (_Jv_JNI_EnsureLocalCapacity): Return JNI_ERR, not -1. (_Jv_JNI_DestroyJavaVM): New function. (_Jv_JNI_AttachCurrentThread): New function. (_Jv_JNI_DetachCurrentThread): New function. (_Jv_JNI_GetEnv): New function. (JNI_CreateJavaVM): New function. (_Jv_JNI_GetJavaVM): New function. (_Jv_JNIFunctions): Added entry for GetJavaVM. * include/jni.h (JavaVMAttachArgs): New structure. (JNI_EDETACHED): New define. (JNI_EVERSION): Likewise. (JavaVM): Define properly. (struct JNIInvokeInterface): New structure. (class _Jv_JavaVM): New class. (JNI_OnLoad, JNI_OnUnload): Declare. (JNI_GetDefaultJavaVMInitArgs, JNI_CreateJavaVM, JNI_GetCreatedJavaVMs): Declare. (JavaVMInitArgs): New typedef. (JavaVMOption): Likewise. (JNI_ERR): New define. (JNI_OK): Likewise. From-SVN: r31901 --- libjava/java/lang/Thread.java | 11 +++++------ libjava/java/lang/natThread.cc | 30 ++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 8 deletions(-) (limited to 'libjava/java/lang') diff --git a/libjava/java/lang/Thread.java b/libjava/java/lang/Thread.java index 3492167..7dbabcf 100644 --- a/libjava/java/lang/Thread.java +++ b/libjava/java/lang/Thread.java @@ -1,6 +1,6 @@ // Thread.java - Thread class. -/* Copyright (C) 1998, 1999 Red Hat, Inc. +/* Copyright (C) 1998, 1999, 2000 Red Hat, Inc. This file is part of libgcj. @@ -10,6 +10,8 @@ details. */ package java.lang; +import gnu.gcj.RawData; + /** * @author Tom Tromey * @date August 24, 1998 @@ -297,11 +299,8 @@ public class Thread implements Runnable private boolean interrupt_flag; private boolean alive_flag; - // This is a bit odd. We need a way to represent some data that is - // manipulated only by the native side of this class. We represent - // it as a Java object reference. However, it is not actually a - // Java object. - private Object data; + // Our native data. + private RawData data; // Next thread number to assign. private static int nextThreadNumber = 0; diff --git a/libjava/java/lang/natThread.cc b/libjava/java/lang/natThread.cc index 6870f02..741f2b5 100644 --- a/libjava/java/lang/natThread.cc +++ b/libjava/java/lang/natThread.cc @@ -1,6 +1,6 @@ // natThread.cc - Native part of Thread class. -/* Copyright (C) 1998, 1999 Red Hat, Inc. +/* Copyright (C) 1998, 1999, 2000 Red Hat, Inc. This file is part of libgcj. @@ -23,6 +23,9 @@ details. */ #include #include #include +#include + +#include @@ -40,6 +43,9 @@ struct natThread // This is private data for the thread system layer. _Jv_Thread_t *thread; + // Each thread has its own JNI object. + JNIEnv *jni_env; + // All threads waiting to join this thread are linked together and // waiting on their respective `interrupt' condition variables. // When this thread exits, it notifies each such thread by @@ -83,10 +89,13 @@ java::lang::Thread::initialize_native (void) // own finalizer then we will need to reinitialize this structure at // any "interesting" point. natThread *nt = (natThread *) _Jv_AllocBytes (sizeof (natThread)); - data = (jobject) nt; + data = reinterpret_cast (nt); _Jv_MutexInit (&nt->interrupt_mutex); _Jv_CondInit (&nt->interrupt_cond); _Jv_ThreadInitData (&nt->thread, this); + // FIXME: if JNI_ENV is set we will want to free it. It is + // malloc()d. + nt->jni_env = NULL; nt->joiner = 0; nt->next = 0; } @@ -324,3 +333,20 @@ java::lang::Thread::yield (void) { _Jv_ThreadYield (); } + +JNIEnv * +_Jv_GetCurrentJNIEnv () +{ + java::lang::Thread *t = _Jv_ThreadCurrent (); + if (t == NULL) + return NULL; + return ((natThread *) t->data)->jni_env; +} + +void +_Jv_SetCurrentJNIEnv (JNIEnv *env) +{ + java::lang::Thread *t = _Jv_ThreadCurrent (); + JvAssert (t != NULL); + ((natThread *) t->data)->jni_env = env; +} -- cgit v1.1