static void reply_msacc(void *vmsaccrp) { ErtsMsAcc *msacc = ERTS_MSACC_TSD_GET(); ErtsMSAccReq *msaccrp = (ErtsMSAccReq *) vmsaccrp; ASSERT(!msacc || !msacc->unmanaged); if (msaccrp->action == ERTS_MSACC_ENABLE && !msacc) { msacc = get_msacc(); msacc->perf_counter = erts_sys_perf_counter(); msacc->state = ERTS_MSACC_STATE_OTHER; ERTS_MSACC_TSD_SET(msacc); } else if (msaccrp->action == ERTS_MSACC_DISABLE && msacc) { ERTS_MSACC_TSD_SET(NULL); } else if (msaccrp->action == ERTS_MSACC_RESET) { msacc = msacc ? msacc : get_msacc(); erts_msacc_reset(msacc); } else if (msaccrp->action == ERTS_MSACC_GATHER && !msacc) { msacc = get_msacc(); } ASSERT(!msacc || !msacc->unmanaged); send_reply(msacc, msaccrp); erts_proc_dec_refc(msaccrp->proc); if (erts_smp_atomic32_dec_read_nob(&msaccrp->refc) == 0) erts_free(ERTS_ALC_T_MSACC, vmsaccrp); }
void erts_msacc_init_thread(char *type, int id, int managed) { ErtsMsAcc *msacc; msacc = erts_alloc(ERTS_ALC_T_MSACC, sizeof(ErtsMsAcc) + sizeof(ErtsMsAccPerfCntr) * ERTS_MSACC_STATE_COUNT); msacc->type = strdup(type); msacc->id = make_small(id); msacc->unmanaged = !managed; msacc->tid = erts_thr_self(); msacc->perf_counter = 0; #ifdef USE_THREADS erts_rwmtx_rwlock(&msacc_mutex); if (!managed) { erts_mtx_init(&msacc->mtx,"msacc_unmanaged_mutex"); msacc->next = msacc_unmanaged; msacc_unmanaged = msacc; msacc_unmanaged_count++; ERTS_MSACC_TSD_SET(msacc); } else { msacc->next = msacc_managed; msacc_managed = msacc; } erts_rwmtx_rwunlock(&msacc_mutex); #else msacc_managed = msacc; #endif erts_msacc_reset(msacc); #ifdef ERTS_MSACC_ALWAYS_ON ERTS_MSACC_TSD_SET(msacc); msacc->perf_counter = erts_sys_perf_counter(); msacc->state = ERTS_MSACC_STATE_OTHER; #endif }