JL_DLLEXPORT jl_value_t *jl_lookup_code_address(void *ip, int skipC) { jl_ptls_t ptls = jl_get_ptls_states(); jl_frame_t *frames = NULL; int8_t gc_state = jl_gc_safe_enter(ptls); int n = jl_getFunctionInfo(&frames, (uintptr_t)ip, skipC, 0); jl_gc_safe_leave(ptls, gc_state); jl_value_t *rs = (jl_value_t*)jl_alloc_svec(n); JL_GC_PUSH1(&rs); for (int i = 0; i < n; i++) { jl_frame_t frame = frames[i]; jl_value_t *r = (jl_value_t*)jl_alloc_svec(7); jl_svecset(rs, i, r); if (frame.func_name) jl_svecset(r, 0, jl_symbol(frame.func_name)); else jl_svecset(r, 0, empty_sym); free(frame.func_name); if (frame.file_name) jl_svecset(r, 1, jl_symbol(frame.file_name)); else jl_svecset(r, 1, empty_sym); free(frame.file_name); jl_svecset(r, 2, jl_box_long(frame.line)); jl_svecset(r, 3, frame.linfo != NULL ? (jl_value_t*)frame.linfo : jl_nothing); jl_svecset(r, 4, jl_box_bool(frame.fromC)); jl_svecset(r, 5, jl_box_bool(frame.inlined)); jl_svecset(r, 6, jl_box_long((intptr_t)ip)); } free(frames); JL_GC_POP(); return rs; }
JL_DLLEXPORT void (jl_gc_safe_leave)(int8_t state) { jl_ptls_t ptls = jl_get_ptls_states(); jl_gc_safe_leave(ptls, state); }
JL_DLLEXPORT void (jl_gc_safe_leave)(int8_t state) { jl_gc_safe_leave(state); }
JL_DLLEXPORT jl_task_t *jl_task_get_next(jl_value_t *getsticky) { jl_ptls_t ptls = jl_get_ptls_states(); // spin briefly before blocking when the workqueue is empty size_t spin_count = 0; jl_task_t *task; while (1) { jl_gc_safepoint(); task = get_next_task(getsticky); if (task) return task; if (!_threadedregion) { spin_count = 0; if (ptls->tid == 0) { if (jl_run_once(jl_global_event_loop()) == 0) { task = get_next_task(getsticky); if (task) return task; #ifdef _OS_WINDOWS_ Sleep(INFINITE); #else pause(); #endif } } else { int sleepnow = 0; uv_mutex_lock(&sleep_lock); if (!_threadedregion) { sleepnow = 1; } else { uv_mutex_unlock(&sleep_lock); } if (sleepnow) { int8_t gc_state = jl_gc_safe_enter(ptls); uv_cond_wait(&sleep_alarm, &sleep_lock); uv_mutex_unlock(&sleep_lock); jl_gc_safe_leave(ptls, gc_state); } } } else { if (++spin_count > 1000 && jl_atomic_load(&jl_uv_n_waiters) == 0 && jl_mutex_trylock(&jl_uv_mutex)) { task = get_next_task(getsticky); if (task) { JL_UV_UNLOCK(); return task; } uv_loop_t *loop = jl_global_event_loop(); loop->stop_flag = 0; uv_run(loop, UV_RUN_ONCE); JL_UV_UNLOCK(); } else { jl_cpu_pause(); } } } }