/** * Returns the list of all Java threads. * * @param[out] threads resulting threads list * @param[out] count_ptr number of threads in the resulting list */ IDATA VMCALL jthread_get_all_threads(jthread ** threads, jint * count_ptr) { assert(threads); assert(count_ptr); hythread_group_t java_thread_group = get_java_thread_group(); assert(java_thread_group); hythread_iterator_t iterator = hythread_iterator_create(java_thread_group); IDATA count = hythread_iterator_size(iterator); IDATA java_thread_count = 0; for (IDATA i = 0; i < count; i++) { hythread_t native_thread = hythread_iterator_next(&iterator); vm_thread_t vm_thread = jthread_get_vm_thread(native_thread); if (vm_thread && vm_thread->java_thread) { java_thread_count++; } } jthread *java_threads = (jthread*)malloc(sizeof(jthread) * java_thread_count); if (!java_threads) { hythread_iterator_release(&iterator); return TM_ERROR_OUT_OF_MEMORY; } hythread_iterator_reset(&iterator); java_thread_count = 0; for (IDATA i = 0; i < count; i++) { hythread_t native_thread = hythread_iterator_next(&iterator); vm_thread_t vm_thread = jthread_get_vm_thread(native_thread); if (vm_thread && vm_thread->java_thread) { hythread_suspend_disable(); ObjectHandle thr = oh_allocate_local_handle(); assert(thr); thr->object = vm_thread->java_thread->object; assert(thr->object); hythread_suspend_enable(); java_threads[java_thread_count++] = thr; } } *threads = java_threads; *count_ptr = (jint)java_thread_count; IDATA status = hythread_iterator_release(&iterator); return status; } // jthread_get_all_threads
hy_inline void test_hythread_suspend_disable() { register hythread_t thread = hythread_self(); // Check that current thread is in default thread group. // Justification: GC suspends and enumerates threads from // default group only. assert(((HyThread_public *)thread)->group == get_java_thread_group()); ((HyThread_public *)thread)->disable_count++; //port_rw_barrier(); if (thread->request && thread->disable_count == 1) { // enter to safe point if suspend request was set // and suspend disable was made a moment ago // (it's a point of entry to the unsafe region) hythread_safe_point_other(thread); } return; } // test_hythread_suspend_disable
/** * Returns the number of all Java threads. * * @param[out] count_ptr number of threads. */ IDATA VMCALL jthread_get_thread_count(jint * count_ptr) { assert(count_ptr); hythread_group_t java_thread_group = get_java_thread_group(); assert(java_thread_group); hythread_iterator_t iterator = hythread_iterator_create(java_thread_group); IDATA count = hythread_iterator_size(iterator); IDATA java_thread_count = 0; for (IDATA i = 0; i < count; i++) { hythread_t native_thread = hythread_iterator_next(&iterator); vm_thread_t vm_thread = jthread_get_vm_thread(native_thread); if (vm_thread) { java_thread_count++; } } *count_ptr = (jint)java_thread_count; IDATA status = hythread_iterator_release(&iterator); return status; } // jthread_get_thread_count
/** * Returns the number of blocked threads. * * @param[out] count_ptr number of threads. */ IDATA VMCALL jthread_get_blocked_count(jint * count_ptr) { assert(count_ptr); hythread_group_t java_thread_group = get_java_thread_group(); assert(java_thread_group); hythread_iterator_t iterator = hythread_iterator_create(java_thread_group); IDATA count = hythread_iterator_size(iterator); IDATA thread_count = 0; for (IDATA i = 0; i < count; i++) { hythread_t native_thread = hythread_iterator_next(&iterator); if (native_thread && hythread_is_blocked_on_monitor_enter(native_thread)) { thread_count++; } } *count_ptr = (jint)thread_count; IDATA status = hythread_iterator_release(&iterator); return status; } // jthread_get_blocked_count