tevent: add tevent_fd_set_close_fn()
authorStefan Metzmacher <metze@samba.org>
Sat, 3 Jan 2009 10:27:00 +0000 (11:27 +0100)
committerStefan Metzmacher <metze@samba.org>
Sat, 3 Jan 2009 18:58:51 +0000 (19:58 +0100)
Let callers specify a close function
as an alternative to TEVENT_FD_AUTOCLOSE.

metze

lib/tevent/tevent.c
lib/tevent/tevent.h
lib/tevent/tevent_aio.c
lib/tevent/tevent_epoll.c
lib/tevent/tevent_fd.c
lib/tevent/tevent_internal.h
lib/tevent/tevent_select.c
lib/tevent/tevent_standard.c

index 931917764691dfdbb6a84be7a28ce345299a816d..93918cc14dc9146bf738d5337e9f4f724ae77a9f 100644 (file)
@@ -240,6 +240,16 @@ struct tevent_aio *_tevent_add_aio(struct tevent_context *ev,
                                handler_name, location);
 }
 
+/*
+  set a close function on the fd event
+*/
+void tevent_fd_set_close_fn(struct tevent_fd *fde,
+                           tevent_fd_close_fn_t close_fn)
+{
+       if (!fde) return;
+       fde->event_ctx->ops->set_fd_close_fn(fde, close_fn);
+}
+
 /*
   return the fd event flags
 */
index 3a1b6057fb76480561cd494638acc326c7561e28..9d3b8aa39e8b733ac07270836594b8c9723e8cfc 100644 (file)
@@ -37,6 +37,10 @@ typedef void (*tevent_fd_handler_t)(struct tevent_context *ev,
                                    struct tevent_fd *fde,
                                    uint16_t flags,
                                    void *private_data);
+typedef void (*tevent_fd_close_fn_t)(struct tevent_context *ev,
+                                    struct tevent_fd *fde,
+                                    int fd,
+                                    void *private_data);
 typedef void (*tevent_timer_handler_t)(struct tevent_context *ev,
                                       struct tevent_timer *te,
                                       struct timeval current_time,
@@ -107,6 +111,8 @@ struct tevent_aio *_tevent_add_aio(struct tevent_context *ev,
 int tevent_loop_once(struct tevent_context *ev);
 int tevent_loop_wait(struct tevent_context *ev);
 
+void tevent_fd_set_close_fn(struct tevent_fd *fde,
+                           tevent_fd_close_fn_t close_fn);
 uint16_t tevent_fd_get_flags(struct tevent_fd *fde);
 void tevent_fd_set_flags(struct tevent_fd *fde, uint16_t flags);
 
index bfe3f070dbd32e2b6fc01151aae50efb89bf2ac4..b768b7906d9bd357f42b6ca896bc50bc71e0b3ec 100644 (file)
@@ -400,7 +400,10 @@ static int aio_event_fd_destructor(struct tevent_fd *fde)
 
        epoll_del_event(aio_ev, fde);
 
-       if (fde->flags & TEVENT_FD_AUTOCLOSE) {
+       if (fde->close_fn) {
+               fde->close_fn(ev, fde, fde->fd, fde->private_data);
+               fde->fd = -1;
+       } else if (fde->flags & TEVENT_FD_AUTOCLOSE) {
                close(fde->fd);
                fde->fd = -1;
        }
@@ -551,6 +554,7 @@ static const struct tevent_ops aio_event_ops = {
        .context_init   = aio_event_context_init,
        .add_fd         = aio_event_add_fd,
        .add_aio        = aio_event_add_aio,
+       .set_fd_close_fn= tevent_common_fd_set_close_fn,
        .get_fd_flags   = tevent_common_fd_get_flags,
        .set_fd_flags   = aio_event_set_fd_flags,
        .add_timer      = tevent_common_add_timer,
index 8fb662e168522aea5edd00699b032e9516af7015..de2d6847a485af03e236f0a10889c6f4ffc5cc03 100644 (file)
@@ -358,7 +358,10 @@ static int epoll_event_fd_destructor(struct tevent_fd *fde)
                
        epoll_del_event(epoll_ev, fde);
 
-       if (fde->flags & TEVENT_FD_AUTOCLOSE) {
+       if (fde->close_fn) {
+               fde->close_fn(ev, fde, fde->fd, fde->private_data);
+               fde->fd = -1;
+       } else if (fde->flags & TEVENT_FD_AUTOCLOSE) {
                close(fde->fd);
                fde->fd = -1;
        }
@@ -463,6 +466,7 @@ static int epoll_event_loop_wait(struct tevent_context *ev)
 static const struct tevent_ops epoll_event_ops = {
        .context_init   = epoll_event_context_init,
        .add_fd         = epoll_event_add_fd,
+       .set_fd_close_fn= tevent_common_fd_set_close_fn,
        .get_fd_flags   = tevent_common_fd_get_flags,
        .set_fd_flags   = epoll_event_set_fd_flags,
        .add_timer      = tevent_common_add_timer,
index eb9cdab531ab14c10ac8dde0c179679bf8475328..d450e2168deeec72e5455f08996bf35828cab42e 100644 (file)
@@ -34,3 +34,9 @@ void tevent_common_fd_set_flags(struct tevent_fd *fde, uint16_t flags)
        if (fde->flags == flags) return;
        fde->flags = flags;
 }
+
+void tevent_common_fd_set_close_fn(struct tevent_fd *fde,
+                                  tevent_fd_close_fn_t close_fn)
+{
+       fde->close_fn = close_fn;
+}
index 6099387362a00ebf710c828e29fe48dbc4ac993c..f29e9c62f5ba423e927c832289119e922a73511e 100644 (file)
@@ -33,6 +33,8 @@ struct tevent_ops {
                                    void *private_data,
                                    const char *handler_name,
                                    const char *location);
+       void (*set_fd_close_fn)(struct tevent_fd *fde,
+                               tevent_fd_close_fn_t close_fn);
        uint16_t (*get_fd_flags)(struct tevent_fd *fde);
        void (*set_fd_flags)(struct tevent_fd *fde, uint16_t flags);
 
@@ -70,8 +72,9 @@ struct tevent_fd {
        struct tevent_fd *prev, *next;
        struct tevent_context *event_ctx;
        int fd;
-       uint16_t flags; /* see EVENT_FD_* flags */
+       uint16_t flags; /* see TEVENT_FD_* flags */
        tevent_fd_handler_t handler;
+       tevent_fd_close_fn_t close_fn;
        /* this is private for the specific handler */
        void *private_data;
        /* this is for debugging only! */
@@ -146,6 +149,8 @@ struct tevent_context {
 
 bool tevent_register_backend(const char *name, const struct tevent_ops *ops);
 
+void tevent_common_fd_set_close_fn(struct tevent_fd *fde,
+                                  tevent_fd_close_fn_t close_fn);
 uint16_t tevent_common_fd_get_flags(struct tevent_fd *fde);
 void tevent_common_fd_set_flags(struct tevent_fd *fde, uint16_t flags);
 
index f6790ab0f456d717dbdf8fd34f0495fcde3676ee..cca771ce85cae253b73789d4aafa6f47c1bf54c8 100644 (file)
@@ -103,7 +103,10 @@ static int select_event_fd_destructor(struct tevent_fd *fde)
        DLIST_REMOVE(select_ev->fd_events, fde);
        select_ev->destruction_count++;
 
-       if (fde->flags & TEVENT_FD_AUTOCLOSE) {
+       if (fde->close_fn) {
+               fde->close_fn(ev, fde, fde->fd, fde->private_data);
+               fde->fd = -1;
+       } else if (fde->flags & TEVENT_FD_AUTOCLOSE) {
                close(fde->fd);
                fde->fd = -1;
        }
@@ -266,6 +269,7 @@ static int select_event_loop_wait(struct tevent_context *ev)
 static const struct tevent_ops select_event_ops = {
        .context_init   = select_event_context_init,
        .add_fd         = select_event_add_fd,
+       .set_fd_close_fn= tevent_common_fd_set_close_fn,
        .get_fd_flags   = tevent_common_fd_get_flags,
        .set_fd_flags   = tevent_common_fd_set_flags,
        .add_timer      = tevent_common_add_timer,
index 3a674152b1a35568b4ad8a08517219657f9bfa58..5d73db55b0ad51d2ae5e245f7a9183d09f518b7f 100644 (file)
@@ -392,7 +392,10 @@ static int std_event_fd_destructor(struct tevent_fd *fde)
 
        epoll_del_event(std_ev, fde);
 
-       if (fde->flags & TEVENT_FD_AUTOCLOSE) {
+       if (fde->close_fn) {
+               fde->close_fn(ev, fde, fde->fd, fde->private_data);
+               fde->fd = -1;
+       } else if (fde->flags & TEVENT_FD_AUTOCLOSE) {
                close(fde->fd);
                fde->fd = -1;
        }
@@ -584,6 +587,7 @@ static int std_event_loop_wait(struct tevent_context *ev)
 static const struct tevent_ops std_event_ops = {
        .context_init   = std_event_context_init,
        .add_fd         = std_event_add_fd,
+       .set_fd_close_fn= tevent_common_fd_set_close_fn,
        .get_fd_flags   = tevent_common_fd_get_flags,
        .set_fd_flags   = std_event_set_fd_flags,
        .add_timer      = tevent_common_add_timer,