13 : obj_(0), class_(0), run_method_(0), init_method_(0), cleanup_method_(0)
25 "threads::JavaThread::destructor:"
26 " Deleting global references.\n");
28 jvm.
env->DeleteGlobalRef(obj_);
29 jvm.
env->DeleteGlobalRef(class_);
36 "threads::JavaThread::assignment:"
37 " Checking for source not being same as dest\n");
39 if (
this != &rhs && obj_ != rhs.
obj_)
41 JNIEnv* env = ::madara_jni_get_env();
47 "threads::JavaThread::assignment:"
48 " Deleting global references from left hand side\n");
50 env->DeleteGlobalRef(obj_);
51 env->DeleteGlobalRef(class_);
53 obj_ = env->NewGlobalRef(rhs.
obj_);
54 class_ = (jclass)env->NewGlobalRef(rhs.
class_);
65 JNIEnv* env = jvm.
env;
68 "threads::JavaThread(%s)::run:"
69 " Calling user-defined run method\n",
72 env->CallVoidMethod(obj_, run_method_);
78 JNIEnv* env = jvm.
env;
81 "threads::JavaThread(%s)::cleanup:"
82 " Calling user-defined cleanup method\n",
85 env->CallVoidMethod(obj_, cleanup_method_);
91 JNIEnv* env = jvm.
env;
94 "threads::JavaThread(%s)::init:"
95 " Creating Java KnowledgeBase from data plane\n",
98 jclass kb_class = madara::utility::java::find_class(
99 env,
"ai/madara/knowledge/KnowledgeBase");
101 jmethodID fromPointerCall = env->GetStaticMethodID(
102 kb_class,
"fromPointer",
"(JZ)Lai/madara/knowledge/KnowledgeBase;");
104 jboolean manage(
false);
106 jobject jknowledge = env->CallStaticObjectMethod(
107 kb_class, fromPointerCall, (jlong)&context, manage);
110 "threads::JavaThread(%s)::init:"
111 " Calling user-defined init method\n",
114 env->CallVoidMethod(obj_, init_method_, jknowledge);
116 env->DeleteLocalRef(jknowledge);
117 env->DeleteWeakGlobalRef(kb_class);
136 JNIEnv* env = jvm.
env;
143 "threads::JavaThread(%s)::check_compliance:"
144 " allocating global reference for object\n",
147 obj_ = (jobject)env->NewGlobalRef(obj);
152 "threads::JavaThread(%s)::check_compliance:"
153 " allocating global reference for object's class\n",
156 class_ = (jclass)env->NewGlobalRef(env->GetObjectClass(obj_));
160 "threads::JavaThread(%s)::check_compliance:"
161 " class and object obtained successfully\n",
165 run_method_ = env->GetMethodID(class_,
"run",
"()V");
166 init_method_ = env->GetMethodID(
167 class_,
"init",
"(Lai/madara/knowledge/KnowledgeBase;)V");
168 cleanup_method_ = env->GetMethodID(class_,
"cleanup",
"()V");
174 "threads::JavaThread(%s)::check_compliance:"
175 " ERROR: run method must be defined\n",
185 "threads::JavaThread(%s)::check_compliance:"
186 " ERROR: init method must be defined\n",
192 if (!cleanup_method_)
196 "threads::JavaThread(%s)::check_compliance:"
197 " ERROR: cleanup method must be defined\n",
207 "threads::JavaThread(%s)::check_compliance:"
208 " ERROR: class object inaccessible\n",
217 "threads::JavaThread(%s)::check_compliance:"
218 " ERROR: object is invalid\n",
227 "threads::JavaThread(%s)::check_compliance:"
228 " ERROR: unable to acquire JAVA environment\n",
244 JNIEnv* env = ::madara_jni_get_env();
247 "threads::JavaThread(%s)::init_control_vars:"
248 " Populating user control plane variables\n",
252 jclass i_class = madara::utility::java::find_class(
253 env,
"ai/madara/knowledge/containers/Integer");
254 jmethodID fromPointerCall = env->GetStaticMethodID(
255 i_class,
"fromPointer",
"(JZ)Lai/madara/knowledge/containers/Integer;");
258 jboolean manage(
false);
261 jobject jterminate = env->CallStaticObjectMethod(
262 i_class, fromPointerCall, (jlong)&terminated, manage);
263 jobject jpaused = env->CallStaticObjectMethod(
264 i_class, fromPointerCall, (jlong)&paused, manage);
267 jfieldID fieldId = env->GetFieldID(
268 class_,
"terminated",
"Lai/madara/knowledge/containers/Integer;");
269 env->SetObjectField(obj_, fieldId, jterminate);
271 fieldId = env->GetFieldID(
272 class_,
"paused",
"Lai/madara/knowledge/containers/Integer;");
273 env->SetObjectField(obj_, fieldId, jpaused);
275 jvm.
env->DeleteWeakGlobalRef(i_class);
276 jvm.
env->DeleteLocalRef(jterminate);
277 jvm.
env->DeleteLocalRef(jpaused);
#define madara_logger_ptr_log(loggering, level,...)
Fast version of the madara::logger::log method for Logger pointers.
This class provides a distributed knowledge base to users.
virtual void init_control_vars(knowledge::KnowledgeBase &control)
Initializes the thread implementation's control plane variables.
A facade for a user-defined Java thread class.
virtual void init(knowledge::KnowledgeBase &context)
Initializes Java thread with MADARA context.
jmethodID cleanup_method_
handle to the cleanup method
jmethodID init_method_
handle to the init method
void operator=(const JavaThread &rhs)
Assignment operator.
jclass class_
the class of the Java object obj_
static JavaThread * create(jobject obj)
Creates a JavaThread.
virtual void run(void)
Executes the Java thread's logic.
virtual void init_control_vars(knowledge::KnowledgeBase &control)
Initializes the Java thread implementation's control plane variables.
bool check_compliance(jobject obj)
Checks a Java object for compliance with ai.madara.threads.BaseThread.
virtual void cleanup(void)
Calls the Java cleanup method.
jmethodID run_method_
handle to the run method
jobject obj_
the Java thread implementation of ai.madara.threads.BaseThread
This class encapsulates attaching and detaching to a VM.
JNIEnv * env
The Java environment.
Provides functions and classes for the distributed knowledge base.
T get(const KnowledgeRecord &kr)
Get the value of a KnowlegeRecord.
MADARA_EXPORT utility::Refcounter< logger::Logger > global_logger
Provides a quality-of-service-enabled threading library.