void erts_init_proc_lock(int cpus) { int i; erts_smp_spinlock_init(&qs_lock, "proc_lck_qs_alloc"); for (i = 0; i < ERTS_NO_OF_PIX_LOCKS; i++) { #ifdef ERTS_ENABLE_LOCK_COUNT erts_smp_spinlock_init_x(&erts_pix_locks[i].u.spnlck, "pix_lock", make_small(i)); #else erts_smp_spinlock_init(&erts_pix_locks[i].u.spnlck, "pix_lock"); #endif } queue_free_list = NULL; erts_thr_install_exit_handler(cleanup_tse); #ifdef ERTS_ENABLE_LOCK_CHECK lc_id.proc_lock_main = erts_lc_get_lock_order_id("proc_main"); lc_id.proc_lock_link = erts_lc_get_lock_order_id("proc_link"); lc_id.proc_lock_msgq = erts_lc_get_lock_order_id("proc_msgq"); lc_id.proc_lock_status = erts_lc_get_lock_order_id("proc_status"); #endif if (cpus > 1) { proc_lock_spin_count = ERTS_PROC_LOCK_SPIN_COUNT_BASE; proc_lock_spin_count += (ERTS_PROC_LOCK_SPIN_COUNT_SCHED_INC * ((int) erts_no_schedulers)); aux_thr_proc_lock_spin_count = ERTS_PROC_LOCK_AUX_SPIN_COUNT; } else if (cpus == 1) { proc_lock_spin_count = 0; aux_thr_proc_lock_spin_count = 0; } else { /* No of cpus unknown. Assume multi proc, but be conservative. */ proc_lock_spin_count = ERTS_PROC_LOCK_SPIN_COUNT_BASE/2; aux_thr_proc_lock_spin_count = ERTS_PROC_LOCK_AUX_SPIN_COUNT/2; } if (proc_lock_spin_count > ERTS_PROC_LOCK_SPIN_COUNT_MAX) proc_lock_spin_count = ERTS_PROC_LOCK_SPIN_COUNT_MAX; }
int init_async(int hndl) { erts_thr_opts_t thr_opts = ERTS_THR_OPTS_DEFAULT_INITER; AsyncQueue* q; int i; thr_opts.detached = 0; thr_opts.suggested_stack_size = erts_async_thread_suggested_stack_size; #ifndef ERTS_SMP callbacks = NULL; async_handle = hndl; erts_mtx_init(&async_ready_mtx, "async_ready"); async_ready_list = NULL; #endif async_id = 0; erts_smp_spinlock_init(&async_id_lock, "async_id"); async_q = q = (AsyncQueue*) (erts_async_max_threads ? erts_alloc(ERTS_ALC_T_ASYNC_Q, erts_async_max_threads * sizeof(AsyncQueue)) : NULL); for (i = 0; i < erts_async_max_threads; i++) { q->head = NULL; q->tail = NULL; q->len = 0; #ifndef ERTS_SMP q->hndl = hndl; #endif #ifdef ERTS_ENABLE_LOCK_CHECK q->no = i; #endif erts_mtx_init(&q->mtx, "asyncq"); erts_cnd_init(&q->cv); erts_thr_create(&q->thr, async_main, (void*)q, &thr_opts); q++; } return 0; }
void erts_bp_init(void) { erts_smp_spinlock_init(&erts_bp_lock, "breakpoints"); }