void erts_cleanup_port_data(Port *prt) { ASSERT(erts_atomic32_read_nob(&prt->state) & ERTS_PORT_SFLGS_INVALID_LOOKUP); cleanup_old_port_data(erts_smp_atomic_xchg_nob(&prt->data, (erts_aint_t) NULL)); }
void erts_cleanup_port_data(Port *prt) { ASSERT(erts_atomic32_read_nob(&prt->state) & ERTS_PORT_SFLGS_INVALID_LOOKUP); cleanup_old_port_data(erts_smp_atomic_read_nob(&prt->data)); erts_smp_atomic_set_nob(&prt->data, (erts_aint_t) THE_NON_VALUE); }
BIF_RETTYPE port_set_data_2(BIF_ALIST_2) { /* * This is not a signal. See comment above. */ erts_aint_t data; Port* prt; prt = data_lookup_port(BIF_P, BIF_ARG_1); if (!prt) BIF_ERROR(BIF_P, BADARG); if (is_immed(BIF_ARG_2)) { data = (erts_aint_t) BIF_ARG_2; ASSERT((data & 0x3) != 0); } else { ErtsPortDataHeap *pdhp; Uint hsize; Eterm *hp; hsize = size_object(BIF_ARG_2); pdhp = erts_alloc(ERTS_ALC_T_PORT_DATA_HEAP, sizeof(ErtsPortDataHeap) + (hsize-1)*sizeof(Eterm)); hp = &pdhp->heap[0]; pdhp->off_heap.first = NULL; pdhp->off_heap.overhead = 0; pdhp->hsize = hsize; pdhp->data = copy_struct(BIF_ARG_2, hsize, &hp, &pdhp->off_heap); data = (erts_aint_t) pdhp; ASSERT((data & 0x3) == 0); } data = erts_smp_atomic_xchg_wb(&prt->data, data); if (data == (erts_aint_t)NULL) { /* Port terminated by racing thread */ data = erts_smp_atomic_xchg_wb(&prt->data, data); ASSERT(data != (erts_aint_t)NULL); cleanup_old_port_data(data); BIF_ERROR(BIF_P, BADARG); } cleanup_old_port_data(data); BIF_RET(am_true); }