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; }
static void node_table_free(void *venp) { ErlNode *enp = (ErlNode *) venp; ERTS_SMP_LC_ASSERT(enp != erts_this_node || erts_thr_progress_is_blocking()); erts_deref_dist_entry(enp->dist_entry); #ifdef DEBUG sys_memset(venp, 0x55, sizeof(ErlNode)); #endif erts_free(ERTS_ALC_T_NODE_ENTRY, venp); ASSERT(node_entries > 0); node_entries--; }
static void node_table_free(void *venp) { ErlNode *enp = (ErlNode *) venp; if(enp == erts_this_node) return; erts_deref_dist_entry(enp->dist_entry); #ifdef DEBUG sys_memset(venp, 0x55, sizeof(ErlNode)); #endif erts_free(ERTS_ALC_T_NODE_ENTRY, venp); ASSERT(node_entries > 1); node_entries--; }
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; }