< prev index next >

test/jdk/java/lang/reflect/exeCallerAccessTest/exeCallerAccessTest.c

Print this page
rev 55510 : 8226863: 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 >