diff options
author | Eric Wong <normalperson@yhbt.net> | 2013-05-30 03:50:45 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2013-05-30 03:50:45 +0000 |
commit | 43ab652e15b4bd0b4cebfe7170c27f312eceb306 (patch) | |
tree | 36f50266ea4d2ab52b37392f8ee20f6c47ebd195 /queue_epoll.c | |
parent | d1c18e26b0cc05009199f3997f0d57b07cdaa331 (diff) | |
download | cmogstored-iosem.tar.gz |
This is similar to the AIO channels functionality in Perlbal, but implemented using semaphores to optimize for the uncontended case.
Diffstat (limited to 'queue_epoll.c')
-rw-r--r-- | queue_epoll.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/queue_epoll.c b/queue_epoll.c index e2e8222..0a9d065 100644 --- a/queue_epoll.c +++ b/queue_epoll.c @@ -209,8 +209,28 @@ fake_epoll_ctl_mod(struct mog_queue *q, struct mog_fd *mfd, enum mog_qev ev) epoll_ctl_error(q, mfd); } +static inline void assert_not_held(struct mog_fd *mfd) +{ + if (!mfd) + return; + + assert(! mfd->as.file.dev_held); +} + void mog_idleq_push(struct mog_queue *q, struct mog_fd *mfd, enum mog_qev ev) { + /* ensure we do not go to sleep while holding a semaphore */ + switch (mfd->fd_type) { + case MOG_FD_TYPE_HTTP: + case MOG_FD_TYPE_HTTPGET: + assert_not_held(mfd->as.http.forward); + break; + case MOG_FD_TYPE_MGMT: + assert_not_held(mfd->as.mgmt.forward); + default: + break; + } + if (epoll_ctl_mod_buggy) fake_epoll_ctl_mod(q, mfd, ev); else |