17#ifdef THREAD_POSIX_IMPL
28static JavaVM *java_vm =
nullptr;
31pthread_key_t ThreadPosixImpl::_pt_ptr_index = 0;
32bool ThreadPosixImpl::_got_pt_ptr_index =
false;
39 if (thread_cat->is_debug()) {
41 <<
"Deleting thread " << _parent_obj->get_name() <<
"\n";
47 pthread_detach(_thread);
61 _thread = pthread_self();
68start(ThreadPriority priority,
bool joinable) {
70 if (thread_cat->is_debug()) {
71 thread_cat.debug() <<
"Starting " << *_parent_obj <<
"\n";
74 nassertd(_status == S_new) {
80 _status = S_start_called;
83 if (!_got_pt_ptr_index) {
88 pthread_attr_init(&attr);
91 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
95 int result = pthread_attr_setstacksize(&attr, thread_stack_size);
98 <<
"Unable to set stack size.\n";
103 result = pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
105 thread_cat->warning()
106 <<
"Unable to set system scope.\n";
109 struct sched_param param;
110 int current_policy = SCHED_OTHER;
111 result = pthread_attr_setschedpolicy(&attr, current_policy);
113 thread_cat->warning()
114 <<
"Unable to set scheduling policy.\n";
121 param.sched_priority = sched_get_priority_min(current_policy);
122 result = pthread_attr_setschedparam(&attr, ¶m);
127 param.sched_priority = sched_get_priority_max(current_policy);
128 result = pthread_attr_setschedparam(&attr, ¶m);
137 thread_cat->warning()
138 <<
"Unable to specify thread priority.\n";
144 result = pthread_create(&_thread, &attr, &root_func, (
void *)
this);
146 pthread_attr_destroy(&attr);
165void ThreadPosixImpl::
171 pthread_join(_thread, &return_val);
181std::string ThreadPosixImpl::
182get_unique_id()
const {
183 std::ostringstream strm;
184 strm << getpid() <<
"." << (uintptr_t)_thread;
194bool ThreadPosixImpl::
197 std::string thread_name = _parent_obj->get_name();
198 JavaVMAttachArgs args;
199 args.version = JNI_VERSION_1_2;
200 args.name = thread_name.c_str();
201 args.group =
nullptr;
202 if (java_vm->AttachCurrentThread(&env, &args) != 0) {
204 <<
"Failed to attach Java VM to thread "
205 << _parent_obj->get_name() <<
"!\n";
217void ThreadPosixImpl::
220 nassertv(thread !=
nullptr);
225 if (java_vm->GetEnv((
void **)&env, JNI_VERSION_1_4) == JNI_OK) {
226 nassertv(thread->_impl._jni_env ==
nullptr || thread->_impl._jni_env == env);
227 thread->_impl._jni_env = env;
230 <<
"Called bind_java_thread() on thread "
231 << *thread <<
", which is not attached to Java VM!\n";
239void *ThreadPosixImpl::
240root_func(
void *data) {
241 TAU_REGISTER_THREAD();
245 ThreadPosixImpl *self = (ThreadPosixImpl *)data;
246 int result = pthread_setspecific(_pt_ptr_index, self->_parent_obj);
247 nassertr(result == 0,
nullptr);
251 nassertd(self->_status == S_start_called) {
252 self->_mutex.unlock();
256 self->_status = S_running;
257 self->_mutex.unlock();
262 self->attach_java_vm();
265 self->_parent_obj->thread_main();
267 if (thread_cat->is_debug()) {
269 <<
"Terminating thread " << self->_parent_obj->get_name()
270 <<
", count = " << self->_parent_obj->get_ref_count() <<
"\n";
275 nassertd(self->_status == S_running) {
276 self->_mutex.unlock();
279 self->_status = S_finished;
280 self->_mutex.unlock();
285 if (self->_jni_env !=
nullptr) {
286 java_vm->DetachCurrentThread();
287 self->_jni_env =
nullptr;
304void ThreadPosixImpl::
306 nassertv(!_got_pt_ptr_index);
308 int result = pthread_key_create(&_pt_ptr_index,
nullptr);
311 <<
"Unable to associate Thread pointers with threads.\n";
315 _got_pt_ptr_index =
true;
320 result = pthread_setspecific(_pt_ptr_index, main_thread_obj);
321 nassertv(result == 0);
328jint JNI_OnLoad(JavaVM *jvm,
void *reserved) {
332 ThreadPosixImpl::bind_java_thread();
333 return JNI_VERSION_1_4;
A thread; that is, a lightweight process.
get_main_thread
Returns a pointer to the "main" Thread object–this is the Thread that started the whole process.
get_current_thread
Returns a pointer to the currently-executing Thread object.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void unref_delete(RefCountType *ptr)
This global helper function will unref the given ReferenceCount object, and if the reference count re...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.