summaryrefslogtreecommitdiff
path: root/defer-internal.h
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-07-26 01:29:39 +0000
committerNick Mathewson <nickm@torproject.org>2009-07-26 01:29:39 +0000
commitb06b2649b4c7f5feaedea97c31001c14708e4d1f (patch)
tree490ee1c4c0fe86771ecf3fdb100a455a2de2e294 /defer-internal.h
parent8cc68835245dd3f542d28299ecfa5c2bc3d471eb (diff)
downloadlibevent-b06b2649b4c7f5feaedea97c31001c14708e4d1f.tar.gz
Make "deferred callback queue" independent of event_base.
This way, we can more easily have an IOCP bufferevent implementation that does not need an event_base at all. Woot. svn:r1381
Diffstat (limited to 'defer-internal.h')
-rw-r--r--defer-internal.h35
1 files changed, 33 insertions, 2 deletions
diff --git a/defer-internal.h b/defer-internal.h
index 8eead90f..cde6e903 100644
--- a/defer-internal.h
+++ b/defer-internal.h
@@ -50,6 +50,20 @@ struct deferred_cb {
void *arg;
};
+
+struct deferred_cb_queue {
+ void *lock;
+
+ int active_count;
+
+ void (*notify_fn)(struct deferred_cb_queue *, void *);
+ void *notify_arg;
+
+ /** Deferred callback management: a list of deferred callbacks to
+ * run active the active events. */
+ TAILQ_HEAD (deferred_cb_list, deferred_cb) deferred_cb_list;
+};
+
/**
Initialize an empty, non-pending deferred_cb.
@@ -61,15 +75,32 @@ void event_deferred_cb_init(struct deferred_cb *, deferred_cb_fn, void *);
/**
Cancel a deferred_cb if it is currently scheduled in an event_base.
*/
-void event_deferred_cb_cancel(struct event_base *, struct deferred_cb *);
+void event_deferred_cb_cancel(struct deferred_cb_queue *, struct deferred_cb *);
/**
Activate a deferred_cb if it is not currently scheduled in an event_base.
*/
-void event_deferred_cb_schedule(struct event_base *, struct deferred_cb *);
+void event_deferred_cb_schedule(struct deferred_cb_queue *, struct deferred_cb *);
+
+#define LOCK_DEFERRED_QUEUE(q) \
+ do { \
+ if ((q)->lock) \
+ _evthread_locking_fn(EVTHREAD_LOCK|EVTHREAD_WRITE, \
+ (q)->lock); \
+ } while (0)
+
+#define UNLOCK_DEFERRED_QUEUE(q) \
+ do { \
+ if ((q)->lock) \
+ _evthread_locking_fn(EVTHREAD_UNLOCK|EVTHREAD_WRITE, \
+ (q)->lock); \
+ } while (0)
#ifdef __cplusplus
}
#endif
+void event_deferred_cb_queue_init(struct deferred_cb_queue *);
+struct deferred_cb_queue *event_base_get_deferred_cb_queue(struct event_base *);
+
#endif /* _EVENT_INTERNAL_H_ */