PUBLIC void mprRescheduleDispatcher(MprDispatcher *dispatcher) { if (dispatcher) { dequeueDispatcher(dispatcher); mprScheduleDispatcher(dispatcher); } }
PUBLIC void mprQueueEvent(MprDispatcher *dispatcher, MprEvent *event) { MprEventService *es; MprEvent *prior, *q; assert(dispatcher); assert(event); assert(event->timestamp); es = dispatcher->service; lock(es); q = dispatcher->eventQ; for (prior = q->prev; prior != q; prior = prior->prev) { if (event->due > prior->due) { break; } else if (event->due == prior->due) { break; } } assert(prior->next); assert(prior->prev); queueEvent(prior, event); event->dispatcher = dispatcher; es->eventCount++; mprScheduleDispatcher(dispatcher); unlock(es); }
PUBLIC int mprStopDispatcher(MprDispatcher *dispatcher) { if (dispatcher->owner != mprGetCurrentOsThread()) { assert(dispatcher->owner == mprGetCurrentOsThread()); return MPR_ERR_BAD_STATE; } if (!isRunning(dispatcher)) { assert(isRunning(dispatcher)); return MPR_ERR_BAD_STATE; } dispatcher->owner = 0; dequeueDispatcher(dispatcher); mprScheduleDispatcher(dispatcher); return 0; }
/* Run events for a dispatcher in a worker thread. When complete, reschedule the dispatcher as required. */ static void dispatchEventsWorker(MprDispatcher *dispatcher) { if (dispatcher->flags & MPR_DISPATCHER_DESTROYED) { /* Dispatcher destroyed after worker started */ return; } dispatcher->owner = mprGetCurrentOsThread(); dispatchEvents(dispatcher); assert(dispatcher->owner == 0 || dispatcher->owner == mprGetCurrentOsThread()); dispatcher->owner = 0; if (!(dispatcher->flags & MPR_DISPATCHER_DESTROYED)) { dequeueDispatcher(dispatcher); mprScheduleDispatcher(dispatcher); } }
PUBLIC void mprRemoveEvent(MprEvent *event) { MprEventService *es; MprDispatcher *dispatcher; dispatcher = event->dispatcher; if (dispatcher) { es = dispatcher->service; lock(es); if (event->next && !(event->flags & MPR_EVENT_RUNNING)) { mprDequeueEvent(event); } event->dispatcher = 0; event->flags &= ~MPR_EVENT_CONTINUOUS; if (event->due == es->willAwake && dispatcher->eventQ->next != dispatcher->eventQ) { mprScheduleDispatcher(dispatcher); } unlock(es); } }