diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-07-26 01:29:39 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-07-26 01:29:39 +0000 |
commit | b06b2649b4c7f5feaedea97c31001c14708e4d1f (patch) | |
tree | 490ee1c4c0fe86771ecf3fdb100a455a2de2e294 /defer-internal.h | |
parent | 8cc68835245dd3f542d28299ecfa5c2bc3d471eb (diff) | |
download | libevent-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.h | 35 |
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_ */ |