about summary refs log tree commit homepage
path: root/queue_epoll.c
diff options
context:
space:
mode:
Diffstat (limited to 'queue_epoll.c')
-rw-r--r--queue_epoll.c20
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