diff options
author | bothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-05-22 06:47:48 +0000 |
---|---|---|
committer | bothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-05-22 06:47:48 +0000 |
commit | 98cf095aceed6a89d0524b8cfbcb11a5ee823c70 (patch) | |
tree | ecfc0fb5d915f5f6596ef061114d1b6b7ec5270a /libjava/gnu | |
parent | 4737d8efd8bdfccb3d0d41413aaf3933f25780ce (diff) | |
download | gcc-98cf095aceed6a89d0524b8cfbcb11a5ee823c70.tar.gz |
Implement invocation interface; don't create new thread for main.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42428 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/gnu')
-rw-r--r-- | libjava/gnu/gcj/jni/NativeThread.java | 29 | ||||
-rw-r--r-- | libjava/gnu/gcj/jni/natNativeThread.cc | 30 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/FirstThread.java | 48 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/natFirstThread.cc | 147 |
4 files changed, 9 insertions, 245 deletions
diff --git a/libjava/gnu/gcj/jni/NativeThread.java b/libjava/gnu/gcj/jni/NativeThread.java deleted file mode 100644 index 4d3eb78ac74..00000000000 --- a/libjava/gnu/gcj/jni/NativeThread.java +++ /dev/null @@ -1,29 +0,0 @@ -// NativeThread.java - Wrapper for attached user threads. - -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -package gnu.gcj.jni; - -/** - * @author Tom Tromey <tromey@cygnus.com> - * @date February 9, 2000 - */ - -public class NativeThread extends Thread -{ - public NativeThread (ThreadGroup g, String name) - { - super (g, null, name); - init (); - } - - // Call this to mark the thread as finished. - public native void finish (); - public native void init (); -} diff --git a/libjava/gnu/gcj/jni/natNativeThread.cc b/libjava/gnu/gcj/jni/natNativeThread.cc deleted file mode 100644 index 359b572ca53..00000000000 --- a/libjava/gnu/gcj/jni/natNativeThread.cc +++ /dev/null @@ -1,30 +0,0 @@ -// natNativeThread.cc - Native side of attached threads. - -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -// Written by Tom Tromey <tromey@cygnus.com> - -#include <config.h> - -#include <gcj/cni.h> -#include <jvm.h> -#include <gnu/gcj/jni/NativeThread.h> -#include <java/lang/Thread.h> - -void -gnu::gcj::jni::NativeThread::finish () -{ - finish_ (); -} - -void -gnu::gcj::jni::NativeThread::init () -{ - alive_flag = true; // alive_flag is private in java.lang.Thread -} diff --git a/libjava/gnu/gcj/runtime/FirstThread.java b/libjava/gnu/gcj/runtime/FirstThread.java index 469d5dde588..fd59261c8c8 100644 --- a/libjava/gnu/gcj/runtime/FirstThread.java +++ b/libjava/gnu/gcj/runtime/FirstThread.java @@ -19,59 +19,29 @@ import java.util.jar.*; // This is entirely internal to our implementation. -final class FirstThread extends Thread +final class FirstThread { - public native void run (); - - public FirstThread (Class k, Object o) - { - super (null, null, "main"); - klass = k; - klass_name = null; - args = o; - } - - public FirstThread (String class_name, Object o) - { - super (null, null, "main"); - klass = null; - klass_name = class_name; - args = o; - } - - private static void die (String s) - { - System.err.println(s); - System.exit(1); - } - - public static void main (String[] args) + public static String getMain (String name) { + String mainName = null; try { - JarFile j = new JarFile (args[0]); + JarFile j = new JarFile (name); Attributes a = j.getManifest().getMainAttributes(); - jarMainClassName = a.getValue(Attributes.Name.MAIN_CLASS); + mainName = a.getValue(Attributes.Name.MAIN_CLASS); - if (jarMainClassName != null) - { - jarMainClassName = jarMainClassName.replace('/','.'); - return; - } } catch (Exception e) { // empty } - System.err.println ("Failed to load Main-Class manifest attribute from\n" - + args[0]); + if (mainName == null) + System.err.println ("Failed to load Main-Class manifest attribute from\n" + + name); + return mainName; } - // If interpreter is invoked with -jar, the main class name is recorded - // here. - public static String jarMainClassName; - // Private data. private Class klass; private String klass_name; diff --git a/libjava/gnu/gcj/runtime/natFirstThread.cc b/libjava/gnu/gcj/runtime/natFirstThread.cc deleted file mode 100644 index c4ba261bdfe..00000000000 --- a/libjava/gnu/gcj/runtime/natFirstThread.cc +++ /dev/null @@ -1,147 +0,0 @@ -// natFirstThread.cc - Implementation of FirstThread native methods. - -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -#include <config.h> - -#include <stdlib.h> - -#include <gcj/cni.h> -#include <jvm.h> -#include <jni.h> - -#include <gnu/gcj/runtime/FirstThread.h> -#include <java/lang/Class.h> -#include <java/lang/String.h> -#include <java/lang/System.h> -#include <java/lang/reflect/Modifier.h> -#include <java/io/PrintStream.h> - -#ifdef ENABLE_JVMPI -#include <jvmpi.h> -#include <java/lang/ThreadGroup.h> -#include <java/lang/UnsatisfiedLinkError.h> -#endif - -#define DIE(Message) die (JvNewStringLatin1 (Message)) - -typedef void main_func (jobject); - -#ifdef WITH_JVMPI -extern void (*_Jv_JVMPI_Notify_THREAD_START) (JVMPI_Event *event); -#endif - -/* This will be non-NULL if the user has preloaded a JNI library, or - linked one into the executable. */ -extern "C" -{ -#pragma weak JNI_OnLoad - extern jint JNI_OnLoad (JavaVM *, void *) __attribute__((weak)); -} - -void -gnu::gcj::runtime::FirstThread::run (void) -{ - - Utf8Const* main_signature = _Jv_makeUtf8Const ("([Ljava.lang.String;)V", 22); - Utf8Const* main_name = _Jv_makeUtf8Const ("main", 4); - - /* Some systems let you preload shared libraries before running a - program. Under Linux, this is done by setting the LD_PRELOAD - environment variable. We take advatage of this here to allow for - dynamically loading a JNI library into a fully linked executable. */ - - if (JNI_OnLoad != NULL) - { - JavaVM *vm = _Jv_GetJavaVM (); - if (vm == NULL) - { - // FIXME: what? - return; - } - jint vers = JNI_OnLoad (vm, NULL); - if (vers != JNI_VERSION_1_1 && vers != JNI_VERSION_1_2) - { - // FIXME: unload the library. - throw new java::lang::UnsatisfiedLinkError (JvNewStringLatin1 ("unrecognized version from preloaded JNI_OnLoad")); - } - } - - if (klass == NULL) - klass = java::lang::Class::forName (klass_name); - if (klass != NULL) - _Jv_InitClass (klass); - - _Jv_Method *meth = _Jv_GetMethodLocal (klass, main_name, main_signature); - - // Some checks from Java Spec section 12.1.4. - if (meth == NULL) - DIE ("no suitable method `main' in class"); - if (! java::lang::reflect::Modifier::isStatic(meth->accflags)) - DIE ("`main' must be static"); - if (! java::lang::reflect::Modifier::isPublic(meth->accflags)) - DIE ("`main' must be public"); - -#ifdef WITH_JVMPI - if (_Jv_JVMPI_Notify_THREAD_START) - { - JVMPI_Event event; - - jstring thread_name = getName (); - jstring group_name = NULL, parent_name = NULL; - java::lang::ThreadGroup *group = getThreadGroup (); - - if (group) - { - group_name = group->getName (); - group = group->getParent (); - - if (group) - parent_name = group->getName (); - } - - int thread_len = thread_name ? JvGetStringUTFLength (thread_name) : 0; - int group_len = group_name ? JvGetStringUTFLength (group_name) : 0; - int parent_len = parent_name ? JvGetStringUTFLength (parent_name) : 0; - - char thread_chars[thread_len + 1]; - char group_chars[group_len + 1]; - char parent_chars[parent_len + 1]; - - if (thread_name) - JvGetStringUTFRegion (thread_name, 0, - thread_name->length(), thread_chars); - if (group_name) - JvGetStringUTFRegion (group_name, 0, - group_name->length(), group_chars); - if (parent_name) - JvGetStringUTFRegion (parent_name, 0, - parent_name->length(), parent_chars); - - thread_chars[thread_len] = '\0'; - group_chars[group_len] = '\0'; - parent_chars[parent_len] = '\0'; - - event.event_type = JVMPI_EVENT_THREAD_START; - event.env_id = NULL; - event.u.thread_start.thread_name = thread_chars; - event.u.thread_start.group_name = group_chars; - event.u.thread_start.parent_name = parent_chars; - event.u.thread_start.thread_id = (jobjectID) this; - event.u.thread_start.thread_env_id = _Jv_GetCurrentJNIEnv (); - - _Jv_DisableGC (); - (*_Jv_JVMPI_Notify_THREAD_START) (&event); - _Jv_EnableGC (); - } -#endif - - main_func *real_main = (main_func *) meth->ncode; - (*real_main) (args); -} |