ER psnd_pdq(ID pdqid, intptr_t data, PRI datapri) { PDQCB *p_pdqcb; ER ercd; LOG_PSND_PDQ_ENTER(pdqid, data, datapri); CHECK_UNL(); CHECK_ID(VALID_PDQID(pdqid)); p_pdqcb = get_pdqcb(pdqid); CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri); lock_cpu(); if (send_pridata(p_pdqcb, data, datapri)) { if (p_runtsk != p_schedtsk) { if (!sense_context()) { dispatch(); } else { request_dispatch(); } } ercd = E_OK; } else { ercd = E_TMOUT; } unlock_cpu(); error_exit: LOG_PSND_PDQ_LEAVE(ercd); return(ercd); }
static void dispatch_timeout_callback(AvahiTimeout *t, void *userdata) { ConnectionData *d = userdata; assert(t); assert(d); connection_data_ref(d); dbus_connection_ref(d->connection); if (dbus_connection_dispatch(d->connection) == DBUS_DISPATCH_DATA_REMAINS) /* If there's still data, request that this handler is called again */ request_dispatch(d, 1); else request_dispatch(d, 0); dbus_connection_unref(d->connection); connection_data_unref(d); }
ER wup_tsk(ID tskid) { TCB *p_tcb; ER ercd; LOG_WUP_TSK_ENTER(tskid); CHECK_UNL(); if (tskid == TSK_SELF && !sense_context()) { p_tcb = p_runtsk; } else { CHECK_ID(VALID_TSKID(tskid)); p_tcb = get_tcb(tskid); } lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (TSTAT_DORMANT(p_tcb->tstat)) { ercd = E_OBJ; } else if (TSTAT_WAIT_SLP(p_tcb->tstat)) { wait_complete(p_tcb); if (p_runtsk != p_schedtsk) { if (!sense_context()) { dispatch(); } else { request_dispatch(); } } ercd = E_OK; } else if (!(p_tcb->wupque)) { p_tcb->wupque = true; ercd = E_OK; } else { ercd = E_QOVR; } unlock_cpu(); error_exit: LOG_WUP_TSK_LEAVE(ercd); return(ercd); }
void wait_tmout_ok(TCB *p_tcb) { p_tcb->p_winfo->wercd = E_OK; make_non_wait(p_tcb); if (p_runtsk != p_schedtsk) { request_dispatch(); } /* * ここで優先度の高い割込みを受け付ける. */ unlock_cpu(); delay_for_interrupt(); lock_cpu(); }
ER act_tsk(ID tskid) { TCB *p_tcb; ER ercd; LOG_ACT_TSK_ENTER(tskid); CHECK_UNL(); /*[NGKI1114]*/ if (tskid == TSK_SELF && !sense_context()) { p_tcb = p_runtsk; /*[NGKI1121]*/ } else { CHECK_ID(VALID_TSKID(tskid)); /*[NGKI1115]*/ p_tcb = get_tcb(tskid); } lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; /*[NGKI1116]*/ } else if (TSTAT_DORMANT(p_tcb->tstat)) { make_active(p_tcb); /*[NGKI1118]*/ if (p_runtsk != p_schedtsk) { if (!sense_context()) { dispatch(); } else { request_dispatch(); } } ercd = E_OK; } else if ((p_tcb->p_tinib->tskatr & TA_NOACTQUE) != 0U || p_tcb->actque) { ercd = E_QOVR; /*[NGKI3528]*/ } else { p_tcb->actque = true; /*[NGKI3527]*/ ercd = E_OK; } unlock_cpu(); error_exit: LOG_ACT_TSK_LEAVE(ercd); return(ercd); }
ER sig_sem(ID semid) { SEMCB *p_semcb; TCB *p_tcb; ER ercd; LOG_SIG_SEM_ENTER(semid); CHECK_UNL(); CHECK_ID(VALID_SEMID(semid)); p_semcb = get_semcb(semid); lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (!queue_empty(&(p_semcb->wait_queue))) { p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue)); wait_complete(p_tcb); if (p_runtsk != p_schedtsk) { if (!sense_context()) { dispatch(); } else { request_dispatch(); } } ercd = E_OK; } else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) { p_semcb->semcnt += 1; ercd = E_OK; } else { ercd = E_QOVR; } unlock_cpu(); error_exit: LOG_SIG_SEM_LEAVE(ercd); return(ercd); }
int avahi_dbus_connection_glue(DBusConnection *c, const AvahiPoll *poll_api) { ConnectionData *d = NULL; assert(c); assert(poll_api); if (!(d = avahi_new(ConnectionData, 1))) goto fail;; d->poll_api = poll_api; d->connection = c; d->ref = 1; if (!(d->dispatch_timeout = poll_api->timeout_new(poll_api, NULL, dispatch_timeout_callback, d))) goto fail; if (!(dbus_connection_set_watch_functions(c, add_watch, remove_watch, watch_toggled, connection_data_ref(d), (DBusFreeFunction)connection_data_unref))) goto fail; if (!(dbus_connection_set_timeout_functions(c, add_timeout, remove_timeout, timeout_toggled, connection_data_ref(d), (DBusFreeFunction)connection_data_unref))) goto fail; dbus_connection_set_dispatch_status_function(c, dispatch_status, connection_data_ref(d), (DBusFreeFunction)connection_data_unref); if (dbus_connection_get_dispatch_status(c) == DBUS_DISPATCH_DATA_REMAINS) request_dispatch(d, 1); connection_data_unref(d); return 0; fail: if (d) { d->poll_api->timeout_free(d->dispatch_timeout); avahi_free(d); } return -1; }
ER rel_wai(ID tskid) { TCB *p_tcb; ER ercd; LOG_REL_WAI_ENTER(tskid); CHECK_UNL(); CHECK_ID(VALID_TSKID(tskid)); p_tcb = get_tcb(tskid); lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (!TSTAT_WAITING(p_tcb->tstat)) { ercd = E_OBJ; } else { wait_dequeue_wobj(p_tcb); wait_dequeue_tmevtb(p_tcb); p_tcb->p_winfo->wercd = E_RLWAI; make_non_wait(p_tcb); if (p_runtsk != p_schedtsk) { if (!sense_context()) { dispatch(); } else { request_dispatch(); } } ercd = E_OK; } unlock_cpu(); error_exit: LOG_REL_WAI_LEAVE(ercd); return(ercd); }
static void dispatch_status(AVAHI_GCC_UNUSED DBusConnection *connection, DBusDispatchStatus new_status, void *userdata) { ConnectionData *d = userdata; if (new_status == DBUS_DISPATCH_DATA_REMAINS) request_dispatch(d, 1); }