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; }
/* * @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; }
/* * @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; }