DistEntry *erts_find_or_insert_dist_entry(Eterm sysname) { DistEntry *res; DistEntry de; erts_aint_t refc; res = erts_find_dist_entry(sysname); if (res) return res; de.sysname = sysname; erts_smp_rwmtx_rwlock(&erts_dist_table_rwmtx); 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_rwmtx_rwunlock(&erts_dist_table_rwmtx); return res; }
DistEntry * erts_channel_no_to_dist_entry(Uint cno) { /* * For this node (and previous incarnations of this node), * ERST_INTERNAL_CHANNEL_NO (will always be 0 I guess) is used as * channel no. For other nodes, the atom index of the atom corresponding * to the node name is used as channel no. */ if(cno == ERST_INTERNAL_CHANNEL_NO) { erts_refc_inc(&erts_this_dist_entry->refc, 2); return erts_this_dist_entry; } if((cno > MAX_ATOM_INDEX) || (cno >= atom_table_size()) || (atom_tab(cno) == NULL)) return NULL; /* cno is a valid atom index; find corresponding dist entry (if there is one) */ return erts_find_dist_entry(make_atom(cno)); }