diff options
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 |