diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-03-13 15:47:33 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-03-17 19:59:00 +0100 |
commit | 66886f8966dff8a980a5b9d2daa3fbb20fe5ca8e (patch) | |
tree | 383df98ac1fc50173ea09e0496eff2040185aeec /lib/tevent/tevent.c | |
parent | d27be1d5fa3fdcaac07b527ad14b0d10ef27c0bb (diff) | |
download | samba-66886f8966dff8a980a5b9d2daa3fbb20fe5ca8e.tar.gz samba-66886f8966dff8a980a5b9d2daa3fbb20fe5ca8e.tar.bz2 samba-66886f8966dff8a980a5b9d2daa3fbb20fe5ca8e.zip |
tevent: add support for immediate events
They're like directly triggered timed events,
but you can preallocated them and scheduling them
will not fail.
metze
Diffstat (limited to 'lib/tevent/tevent.c')
-rw-r--r-- | lib/tevent/tevent.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/tevent/tevent.c b/lib/tevent/tevent.c index 31dc58d98e..ba2d93f4b9 100644 --- a/lib/tevent/tevent.c +++ b/lib/tevent/tevent.c @@ -143,6 +143,7 @@ int tevent_common_context_destructor(struct tevent_context *ev) { struct tevent_fd *fd, *fn; struct tevent_timer *te, *tn; + struct tevent_immediate *ie, *in; struct tevent_signal *se, *sn; if (ev->pipe_fde) { @@ -162,6 +163,13 @@ int tevent_common_context_destructor(struct tevent_context *ev) DLIST_REMOVE(ev->timer_events, te); } + for (ie = ev->immediate_events; ie; ie = in) { + in = ie->next; + ie->event_ctx = NULL; + ie->cancel_fn = NULL; + DLIST_REMOVE(ev->immediate_events, ie); + } + for (se = ev->signal_events; se; se = sn) { sn = se->next; se->event_ctx = NULL; @@ -350,6 +358,47 @@ struct tevent_timer *_tevent_add_timer(struct tevent_context *ev, } /* + allocate an immediate event + return NULL on failure (memory allocation error) +*/ +struct tevent_immediate *_tevent_create_immediate(TALLOC_CTX *mem_ctx, + const char *location) +{ + struct tevent_immediate *im; + + im = talloc(mem_ctx, struct tevent_immediate); + if (im == NULL) return NULL; + + im->prev = NULL; + im->next = NULL; + im->event_ctx = NULL; + im->create_location = location; + im->handler = NULL; + im->private_data = NULL; + im->handler_name = NULL; + im->schedule_location = NULL; + im->cancel_fn = NULL; + im->additional_data = NULL; + + return im; +} + +/* + schedule an immediate event + return NULL on failure +*/ +void _tevent_schedule_immediate(struct tevent_immediate *im, + struct tevent_context *ev, + tevent_immediate_handler_t handler, + void *private_data, + const char *handler_name, + const char *location) +{ + ev->ops->schedule_immediate(im, ev, handler, private_data, + handler_name, location); +} + +/* add a signal event sa_flags are flags to sigaction(2) |