static ErtsMonitor *create_monitor(Uint type, Eterm ref, Eterm pid, Eterm name) { Uint mon_size = ERTS_MONITOR_SIZE; ErtsMonitor *n; Eterm *hp; mon_size += NC_HEAP_SIZE(ref); if (!IS_CONST(pid)) { mon_size += NC_HEAP_SIZE(pid); } if (mon_size <= ERTS_MONITOR_SH_SIZE) { n = (ErtsMonitor *) erts_alloc(ERTS_ALC_T_MONITOR_SH, mon_size*sizeof(Uint)); } else { n = (ErtsMonitor *) erts_alloc(ERTS_ALC_T_MONITOR_LH, mon_size*sizeof(Uint)); erts_smp_atomic_add_nob(&tot_link_lh_size, mon_size*sizeof(Uint)); } hp = n->heap; n->left = n->right = NULL; /* Always the same initial value*/ n->type = (Uint16) type; n->balance = 0; /* Always the same initial value */ n->name = name; /* atom() or [] */ CP_LINK_VAL(n->ref, hp, ref); /*XXX Unneccesary check, never immediate*/ CP_LINK_VAL(n->pid, hp, pid); return n; }
static ErtsMonitor *create_monitor(Uint type, Eterm ref, UWord entity, Eterm name) { Uint mon_size = ERTS_MONITOR_SIZE; ErtsMonitor *n; Eterm *hp; mon_size += NC_HEAP_SIZE(ref); if (type != MON_NIF_TARGET && is_not_immed(entity)) { mon_size += NC_HEAP_SIZE(entity); } if (mon_size <= ERTS_MONITOR_SH_SIZE) { n = (ErtsMonitor *) erts_alloc(ERTS_ALC_T_MONITOR_SH, mon_size*sizeof(Uint)); } else { n = (ErtsMonitor *) erts_alloc(ERTS_ALC_T_MONITOR_LH, mon_size*sizeof(Uint)); erts_smp_atomic_add_nob(&tot_link_lh_size, mon_size*sizeof(Uint)); } hp = n->heap; n->left = n->right = NULL; /* Always the same initial value*/ n->type = (Uint16) type; n->balance = 0; /* Always the same initial value */ n->name = name; /* atom() or [] */ CP_LINK_VAL(n->ref, hp, ref); /*XXX Unnecessary check, never immediate*/ if (type == MON_NIF_TARGET) n->u.resource = (ErtsResource*)entity; else CP_LINK_VAL(n->u.pid, hp, (Eterm)entity); return n; }
static ErtsLink *create_link(Uint type, Eterm pid) { Uint lnk_size = ERTS_LINK_SIZE; ErtsLink *n; Eterm *hp; if (!IS_CONST(pid)) { lnk_size += NC_HEAP_SIZE(pid); } if (lnk_size <= ERTS_LINK_SH_SIZE) { n = (ErtsLink *) erts_alloc(ERTS_ALC_T_NLINK_SH, lnk_size*sizeof(Uint)); } else { n = (ErtsLink *) erts_alloc(ERTS_ALC_T_NLINK_LH, lnk_size*sizeof(Uint)); erts_smp_atomic_add_nob(&tot_link_lh_size, lnk_size*sizeof(Uint)); } hp = n->heap; n->left = n->right = NULL; /* Always the same initial value*/ n->type = (Uint16) type; n->balance = 0; /* Always the same initial value */ if (n->type == LINK_NODE) { ERTS_LINK_REFC(n) = 0; } else { ERTS_LINK_ROOT(n) = NULL; } CP_LINK_VAL(n->pid, hp, pid); return n; }