Example #1
0
int mk_http_thread_event(struct mk_event *event)
{
    struct mk_sched_conn *conn = (struct mk_sched_conn *) event;

    struct mk_thread *th;
    struct mk_http_thread *mth;

    th = conn->channel.thread;
    mth = (struct mk_http_thread *) MK_THREAD_DATA(th);
    mk_thread_resume(conn->channel.thread);
    return 0;
}
Example #2
0
/*
 * @METHOD_NAME: chan_send
 * @METHOD_DESC: add a new element to the given channel.
 * @METHOD_PROTO: int chan_send(mk_thread_channel_t *chan, void *data)
 * @METHOD_PARAM: chan the target channel to send.
 * @METHOD_PARAM: data the new element to be sent to channel.
 * @METHOD_RETURN: return THREAD_CHANNEL_BROKEN if the other side of the pipe
 * is closed, otherwise return THREAD_CHANNEL_OK.
 */
int mk_thread_channel_send(struct mk_thread_channel *chan, void *data)
{
    struct mk_thread_channel_elem *elem;

    assert(chan);
    if (chan->receiver == -1) {
        return MK_THREAD_CHANNEL_BROKEN;
    }
    if (chan->used == chan->size) {
        // channel is full
        mk_thread_resume(chan->receiver);
    }

    elem = mk_thread_channel_elem_create(data);
    mk_list_add(&elem->_head, &chan->bufs);
    chan->used++;
    return MK_THREAD_CHANNEL_OK;
}
Example #3
0
/*
 * @METHOD_NAME: chan_recv
 * @METHOD_DESC: remove an element from a given channel.
 * @METHOD_PROTO: void *chan_recv(mk_thread_channel_t *chan)
 * @METHOD_PARAM: chan the target channel to receive.
 * @METHOD_RETURN: the front element of the channel.
 */
void *mk_thread_channel_recv(struct mk_thread_channel *chan)
{
    void *data;
    struct mk_thread_channel_elem *elem;

    assert(chan);
    assert(!chan->done);

    if (chan->used == 0) {
        /* channel is empty */
        mk_thread_resume(chan->sender);
    }

    elem = mk_list_entry_first(&chan->bufs, struct mk_thread_channel_elem, _head);
    data = elem->data;
    mk_thread_channel_elem_free(elem);
    chan->used--;
    if (chan->used == 0 && chan->ended) {
        chan->done = 1;
    }
    return data;
}