< prev index next >
test/jdk/java/lang/reflect/exeCallerAccessTest/exeCallerAccessTest.c
Print this page
rev 55510 : 8226863: [aix] jdk/java/lang/reflect/exeCallerAccessTest cannot launch on primordial thread
Reviewed-by:
@@ -24,21 +24,24 @@
#include <stdio.h>
#include <stdlib.h>
#include "jni.h"
#include "assert.h"
+#ifndef WIN32
+#include "pthread.h"
+#endif
static jclass classClass;
static jclass iaeClass;
static jmethodID mid_Class_forName;
static jmethodID mid_Class_getField;
static jmethodID mid_Field_get;
int getField(JNIEnv *env, char* declaringClass_name, char* field_name);
int checkAndClearIllegalAccessExceptionThrown(JNIEnv *env);
-int main(int argc, char** args) {
+static int main_inner(int argc, char** args) {
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
jint rc;
@@ -125,5 +128,61 @@
return 3;
}
return 0;
}
+/* On AIX, unfortunately, we are not able to invoke the libjvm on the primordial thread. */
+
+#ifdef _AIX
+#define DEFAULT_SPAWN_IN_NEW_THREAD
+#else
+#undef DEFAULT_SPAWN_IN_NEW_THREAD
+#endif
+
+struct args_t {
+ int argc; char** argv;
+};
+
+#define STACK_SIZE 0x200000
+
+#ifdef _WIN32
+
+#error Not implemented on Windows.
+
+#else
+
+static void* thread_wrapper(void* p) {
+ const struct args_t* const p_args = (const struct args_t*) p;
+ main_inner(p_args->argc, p_args->argv);
+ return 0;
+}
+
+static void run_in_new_thread(const struct args_t* args) {
+ pthread_t tid;
+ pthread_attr_t attr;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, STACK_SIZE);
+
+ if (pthread_create(&tid, &attr, thread_wrapper, (void*)args) != 0) {
+ fprintf(stderr, "Failed to create main thread\n");
+ exit(2);
+ }
+
+ if (pthread_join(tid, NULL) != 0) {
+ fprintf(stderr, "Failed to join main thread\n");
+ exit(2);
+ }
+}
+
+#endif /* ! WIN32 */
+
+int main(int argc, char** args) {
+#ifdef DEFAULT_SPAWN_IN_NEW_THREAD
+ struct args_t a;
+ a.argc = argc;
+ a.argv = args;
+ run_in_new_thread(&a);
+#else
+ main_inner(argc, args);
+#endif
+}
< prev index next >