Exemple #1
0
PUBLIC void mprRescheduleDispatcher(MprDispatcher *dispatcher)
{
    if (dispatcher) {
        dequeueDispatcher(dispatcher);
        mprScheduleDispatcher(dispatcher);
    }
}
Exemple #2
0
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);
}
Exemple #3
0
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;
}
Exemple #4
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);
    }
}
Exemple #5
0
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);
    }
}