ErlNode *erts_find_or_insert_node(Eterm sysname, Uint creation) { ErlNode *res; ErlNode ne; ne.sysname = sysname; ne.creation = creation; erts_smp_rwmtx_rlock(&erts_node_table_rwmtx); res = hash_get(&erts_node_table, (void *) &ne); if (res && res != erts_this_node) { erts_aint_t refc = erts_refc_inctest(&res->refc, 0); if (refc < 2) /* New or pending delete */ erts_refc_inc(&res->refc, 1); } erts_smp_rwmtx_runlock(&erts_node_table_rwmtx); if (res) return res; erts_smp_rwmtx_rwlock(&erts_node_table_rwmtx); res = hash_put(&erts_node_table, (void *) &ne); ASSERT(res); if (res != erts_this_node) { erts_aint_t refc = erts_refc_inctest(&res->refc, 0); if (refc < 2) /* New or pending delete */ erts_refc_inc(&res->refc, 1); } erts_smp_rwmtx_rwunlock(&erts_node_table_rwmtx); return res; }
void erts_ddll_reference_driver(DE_Handle *dh) { assert_drv_list_locked(); if (erts_refc_inctest(&(dh->refc),1) == 1) { erts_refc_inc(&(dh->refc),2); /* add a reference for the scheduled operation */ } }
DistEntry * erts_sysname_to_connected_dist_entry(Eterm sysname) { DistEntry de; DistEntry *res_dep; de.sysname = sysname; if(erts_this_dist_entry->sysname == sysname) { erts_refc_inc(&erts_this_dist_entry->refc, 2); return erts_this_dist_entry; } erts_smp_rwmtx_rlock(&erts_dist_table_rwmtx); res_dep = (DistEntry *) hash_get(&erts_dist_table, (void *) &de); if (res_dep) { erts_aint_t refc = erts_refc_inctest(&res_dep->refc, 1); if (refc < 2) /* Pending delete */ erts_refc_inc(&res_dep->refc, 1); } erts_smp_rwmtx_runlock(&erts_dist_table_rwmtx); if (res_dep) { int deref; erts_smp_rwmtx_rlock(&res_dep->rwmtx); deref = is_nil(res_dep->cid); erts_smp_rwmtx_runlock(&res_dep->rwmtx); if (deref) { erts_deref_dist_entry(res_dep); res_dep = NULL; } } return res_dep; }
DistEntry *erts_find_or_insert_dist_entry(Eterm sysname) { DistEntry *res; DistEntry de; long refc; de.sysname = sysname; erts_smp_mtx_lock(&erts_dist_table_mtx); res = hash_put(&erts_dist_table, (void *) &de); refc = erts_refc_inctest(&res->refc, 0); if (refc < 2) /* New or pending delete */ erts_refc_inc(&res->refc, 1); erts_smp_mtx_unlock(&erts_dist_table_mtx); return res; }
static void suspend_until_thr_prg(Process* p) { Binary* state_bin; ErtsFlxCtrWakeUpLaterInfo* info; state_bin = erts_create_magic_binary(sizeof(ErtsFlxCtrWakeUpLaterInfo), erts_flxctr_wait_dtor); info = ERTS_MAGIC_BIN_DATA(state_bin); info->process = p; erts_refc_inctest(&state_bin->intern.refc, 1); erts_suspend(p, ERTS_PROC_LOCK_MAIN, NULL); erts_proc_inc_refc(p); ERTS_VBUMP_ALL_REDS(p); erts_schedule_thr_prgr_later_op(thr_prg_wake_up_later, state_bin, &info->later_op); }
DistEntry *erts_find_dist_entry(Eterm sysname) { DistEntry *res; DistEntry de; de.sysname = sysname; erts_smp_mtx_lock(&erts_dist_table_mtx); res = hash_get(&erts_dist_table, (void *) &de); if (res) { long refc = erts_refc_inctest(&res->refc, 1); if (refc < 2) /* Pending delete */ erts_refc_inc(&res->refc, 1); } erts_smp_mtx_unlock(&erts_dist_table_mtx); return res; }
DistEntry * erts_sysname_to_connected_dist_entry(Eterm sysname) { DistEntry de; DistEntry *res_dep; de.sysname = sysname; if(erts_this_dist_entry->sysname == sysname) { erts_refc_inc(&erts_this_dist_entry->refc, 2); return erts_this_dist_entry; } erts_smp_mtx_lock(&erts_dist_table_mtx); res_dep = (DistEntry *) hash_get(&erts_dist_table, (void *) &de); if (res_dep) { long refc = erts_refc_inctest(&res_dep->refc, 1); if (refc < 2) /* Pending delete */ erts_refc_inc(&res_dep->refc, 1); } erts_smp_mtx_unlock(&erts_dist_table_mtx); if (res_dep) { erts_smp_mtx_t *mtxp; #ifdef ERTS_SMP mtxp = res_dep->mtxp; #else mtxp = NULL; #endif erts_smp_mtx_lock(mtxp); if (is_nil(res_dep->cid)) { erts_deref_dist_entry(res_dep); res_dep = NULL; } erts_smp_mtx_unlock(mtxp); } return res_dep; }
ErlFunEntry* erts_put_fun_entry(Eterm mod, int uniq, int index) { ErlFunEntry template; ErlFunEntry* fe; erts_aint_t refc; ASSERT(is_atom(mod)); template.old_uniq = uniq; template.old_index = index; template.module = mod; erts_fun_write_lock(); fe = (ErlFunEntry *) hash_put(&erts_fun_table, (void*) &template); sys_memset(fe->uniq, 0, sizeof(fe->uniq)); fe->index = 0; refc = erts_refc_inctest(&fe->refc, 0); if (refc < 2) /* New or pending delete */ erts_refc_inc(&fe->refc, 1); erts_fun_write_unlock(); return fe; } ErlFunEntry* erts_put_fun_entry2(Eterm mod, int old_uniq, int old_index, byte* uniq, int index, int arity) { ErlFunEntry template; ErlFunEntry* fe; erts_aint_t refc; ASSERT(is_atom(mod));