static void *async_main(void* arg) { ErtsAsyncQ *aq = (ErtsAsyncQ *) arg; erts_tse_t *tse = async_thread_init(aq); ERTS_MSACC_DECLARE_CACHE(); while (1) { ErtsThrQPrepEnQ_t *prep_enq; ErtsAsync *a = async_get(&aq->thr_q, tse, &prep_enq); if (is_nil(a->port)) break; /* Time to die */ ERTS_MSACC_UPDATE_CACHE(); #if ERTS_ASYNC_PRINT_JOB erts_fprintf(stderr, "<- %ld\n", a->async_id); #endif ERTS_MSACC_SET_STATE_CACHED(ERTS_MSACC_STATE_PORT); a->async_invoke(a->async_data); ERTS_MSACC_SET_STATE_CACHED(ERTS_MSACC_STATE_OTHER); async_reply(a, prep_enq); } return NULL; }
/*===========================================================================* * send_reply * *===========================================================================*/ static void send_reply(int type, message *m_ptr, int ipc_status, int reply) { /* Prepare and send a reply message. */ if (reply == EDONTREPLY) return; if (type == CHARDRIVER_ASYNC) async_reply(m_ptr, reply); else sync_reply(m_ptr, ipc_status, reply); }