summaryrefslogtreecommitdiff
path: root/source4/lib/events/events.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2007-05-14 00:57:48 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:52:21 -0500
commitecc54f900fa6aaf1b97ef85b1101cf7badf33cec (patch)
tree4985d6817c5b8e052fb4e0a3946a638697b602a0 /source4/lib/events/events.c
parentbc02bba4499b7f6c78dc5db0610fe4f4d238829a (diff)
downloadsamba-ecc54f900fa6aaf1b97ef85b1101cf7badf33cec.tar.gz
samba-ecc54f900fa6aaf1b97ef85b1101cf7badf33cec.tar.bz2
samba-ecc54f900fa6aaf1b97ef85b1101cf7badf33cec.zip
r22830: merged the latest lib/events updates from ctdb to Samba4. This
includes a new EVENT_FD_AUTOCLOSE flag that prevents race conditions where code using fd events might close a fd before releasing the struct fd_event. That causes headaches for epoll. (This used to be commit f1ad216de13b154a1f8747a44b0970dcc47a784a)
Diffstat (limited to 'source4/lib/events/events.c')
-rw-r--r--source4/lib/events/events.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/source4/lib/events/events.c b/source4/lib/events/events.c
index 3a81b55bd9..5b36e70ac0 100644
--- a/source4/lib/events/events.c
+++ b/source4/lib/events/events.c
@@ -71,6 +71,8 @@ struct event_ops_list {
/* list of registered event backends */
static struct event_ops_list *event_backends;
+static char *event_default_backend = NULL;
+
/*
register an events backend
*/
@@ -86,6 +88,15 @@ bool event_register_backend(const char *name, const struct event_ops *ops)
}
/*
+ set the default event backend
+ */
+void event_set_default_backend(const char *backend)
+{
+ if (event_default_backend) free(event_default_backend);
+ event_default_backend = strdup(backend);
+}
+
+/*
initialise backends if not already done
*/
static void event_backend_init(void)
@@ -99,7 +110,15 @@ static void event_backend_init(void)
run_init_functions(shared_init);
#else
bool events_standard_init(void);
+ bool events_select_init(void);
+ events_select_init();
events_standard_init();
+#if HAVE_EVENTS_EPOLL
+ {
+ bool events_epoll_init(void);
+ events_epoll_init();
+ }
+#endif
#endif
}
@@ -170,6 +189,9 @@ struct event_context *event_context_init_byname(TALLOC_CTX *mem_ctx, const char
}
#endif
if (name == NULL) {
+ name = event_default_backend;
+ }
+ if (name == NULL) {
name = "standard";
}
@@ -195,6 +217,9 @@ struct event_context *event_context_init(TALLOC_CTX *mem_ctx)
/*
add a fd based event
return NULL on failure (memory allocation error)
+
+ if flags contains EVENT_FD_AUTOCLOSE then the fd will be closed when
+ the returned fd_event context is freed
*/
struct fd_event *event_add_fd(struct event_context *ev, TALLOC_CTX *mem_ctx,
int fd, uint16_t flags, event_fd_handler_t handler,