xref: /unit/src/java/nxt_jni_Thread.c (revision 977:4f9268f27b57)
1*977Smax.romanov@gmail.com 
2*977Smax.romanov@gmail.com /*
3*977Smax.romanov@gmail.com  * Copyright (C) NGINX, Inc.
4*977Smax.romanov@gmail.com  */
5*977Smax.romanov@gmail.com 
6*977Smax.romanov@gmail.com #include <nxt_unit.h>
7*977Smax.romanov@gmail.com #include <jni.h>
8*977Smax.romanov@gmail.com 
9*977Smax.romanov@gmail.com #include "nxt_jni_Thread.h"
10*977Smax.romanov@gmail.com 
11*977Smax.romanov@gmail.com 
12*977Smax.romanov@gmail.com static jclass     nxt_java_Thread_class;
13*977Smax.romanov@gmail.com static jmethodID  nxt_java_Thread_currentThread;
14*977Smax.romanov@gmail.com static jmethodID  nxt_java_Thread_getContextClassLoader;
15*977Smax.romanov@gmail.com static jmethodID  nxt_java_Thread_setContextClassLoader;
16*977Smax.romanov@gmail.com 
17*977Smax.romanov@gmail.com 
18*977Smax.romanov@gmail.com int
nxt_java_initThread(JNIEnv * env)19*977Smax.romanov@gmail.com nxt_java_initThread(JNIEnv *env)
20*977Smax.romanov@gmail.com {
21*977Smax.romanov@gmail.com     jclass  cls;
22*977Smax.romanov@gmail.com 
23*977Smax.romanov@gmail.com     cls = (*env)->FindClass(env, "java/lang/Thread");
24*977Smax.romanov@gmail.com     if (cls == NULL) {
25*977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "java.lang.Thread not found");
26*977Smax.romanov@gmail.com         return NXT_UNIT_ERROR;
27*977Smax.romanov@gmail.com     }
28*977Smax.romanov@gmail.com 
29*977Smax.romanov@gmail.com     nxt_java_Thread_class = (*env)->NewGlobalRef(env, cls);
30*977Smax.romanov@gmail.com     (*env)->DeleteLocalRef(env, cls);
31*977Smax.romanov@gmail.com     cls = nxt_java_Thread_class;
32*977Smax.romanov@gmail.com 
33*977Smax.romanov@gmail.com     nxt_java_Thread_currentThread = (*env)->GetStaticMethodID(env, cls,
34*977Smax.romanov@gmail.com         "currentThread", "()Ljava/lang/Thread;");
35*977Smax.romanov@gmail.com     if (nxt_java_Thread_currentThread == NULL) {
36*977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "java.lang.Thread.currentThread() not found");
37*977Smax.romanov@gmail.com         goto failed;
38*977Smax.romanov@gmail.com     }
39*977Smax.romanov@gmail.com 
40*977Smax.romanov@gmail.com     nxt_java_Thread_getContextClassLoader = (*env)->GetMethodID(env, cls,
41*977Smax.romanov@gmail.com         "getContextClassLoader", "()Ljava/lang/ClassLoader;");
42*977Smax.romanov@gmail.com     if (nxt_java_Thread_getContextClassLoader == NULL) {
43*977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "java.lang.Thread.getContextClassLoader() "
44*977Smax.romanov@gmail.com                       "not found");
45*977Smax.romanov@gmail.com         goto failed;
46*977Smax.romanov@gmail.com     }
47*977Smax.romanov@gmail.com 
48*977Smax.romanov@gmail.com     nxt_java_Thread_setContextClassLoader = (*env)->GetMethodID(env, cls,
49*977Smax.romanov@gmail.com         "setContextClassLoader", "(Ljava/lang/ClassLoader;)V");
50*977Smax.romanov@gmail.com     if (nxt_java_Thread_setContextClassLoader == NULL) {
51*977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "java.lang.Thread.setContextClassLoader() "
52*977Smax.romanov@gmail.com                       "not found");
53*977Smax.romanov@gmail.com         goto failed;
54*977Smax.romanov@gmail.com     }
55*977Smax.romanov@gmail.com 
56*977Smax.romanov@gmail.com     return NXT_UNIT_OK;
57*977Smax.romanov@gmail.com 
58*977Smax.romanov@gmail.com failed:
59*977Smax.romanov@gmail.com 
60*977Smax.romanov@gmail.com     (*env)->DeleteGlobalRef(env, cls);
61*977Smax.romanov@gmail.com     return NXT_UNIT_ERROR;
62*977Smax.romanov@gmail.com }
63*977Smax.romanov@gmail.com 
64*977Smax.romanov@gmail.com void
nxt_java_setContextClassLoader(JNIEnv * env,jobject cl)65*977Smax.romanov@gmail.com nxt_java_setContextClassLoader(JNIEnv *env, jobject cl)
66*977Smax.romanov@gmail.com {
67*977Smax.romanov@gmail.com     jobject thread;
68*977Smax.romanov@gmail.com 
69*977Smax.romanov@gmail.com     thread = (*env)->CallStaticObjectMethod(env, nxt_java_Thread_class,
70*977Smax.romanov@gmail.com                                             nxt_java_Thread_currentThread);
71*977Smax.romanov@gmail.com 
72*977Smax.romanov@gmail.com     if (thread == NULL) {
73*977Smax.romanov@gmail.com         return;
74*977Smax.romanov@gmail.com     }
75*977Smax.romanov@gmail.com 
76*977Smax.romanov@gmail.com     (*env)->CallVoidMethod(env, thread, nxt_java_Thread_setContextClassLoader,
77*977Smax.romanov@gmail.com                            cl);
78*977Smax.romanov@gmail.com }
79*977Smax.romanov@gmail.com 
80*977Smax.romanov@gmail.com jobject
nxt_java_getContextClassLoader(JNIEnv * env)81*977Smax.romanov@gmail.com nxt_java_getContextClassLoader(JNIEnv *env)
82*977Smax.romanov@gmail.com {
83*977Smax.romanov@gmail.com     jobject thread;
84*977Smax.romanov@gmail.com 
85*977Smax.romanov@gmail.com     thread = (*env)->CallStaticObjectMethod(env, nxt_java_Thread_class,
86*977Smax.romanov@gmail.com                                             nxt_java_Thread_currentThread);
87*977Smax.romanov@gmail.com 
88*977Smax.romanov@gmail.com     if (thread == NULL) {
89*977Smax.romanov@gmail.com         return NULL;
90*977Smax.romanov@gmail.com     }
91*977Smax.romanov@gmail.com 
92*977Smax.romanov@gmail.com     return (*env)->CallObjectMethod(env, thread,
93*977Smax.romanov@gmail.com                                     nxt_java_Thread_getContextClassLoader);
94*977Smax.romanov@gmail.com }
95