chiark / gitweb /
bus: introduce concept of a "default" event loop per-thread and make use of it everywhere
authorLennart Poettering <lennart@poettering.net>
Mon, 11 Nov 2013 18:34:13 +0000 (19:34 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 11 Nov 2013 23:12:43 +0000 (00:12 +0100)
Try to emphasize a bit that there should be a mapping between event
loops and threads, hence introduce a logic that there's one "default"
event loop for each thread, that can be queried via
"sd_event_default()".

src/hostname/hostnamed.c
src/libsystemd-bus/libsystemd-bus.sym
src/libsystemd-bus/sd-event.c
src/libsystemd-bus/test-event.c
src/locale/localed.c
src/login/logind.c
src/machine/machined.c
src/network/networkd-manager.c
src/socket-proxy/socket-proxyd.c
src/systemd/sd-event.h
src/timedate/timedated.c

index 35dccf8cb6c6aeaff2b30380c2aca3720c16a3ff..d2f0b022e5391471c087e7f82d2181181e783121 100644 (file)
@@ -643,7 +643,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
                 goto finish;
         }
 
-        r = sd_event_new(&event);
+        r = sd_event_default(&event);
         if (r < 0) {
                 log_error("Failed to allocate event loop: %s", strerror(-r));
                 goto finish;
         if (r < 0) {
                 log_error("Failed to allocate event loop: %s", strerror(-r));
                 goto finish;
index 2c4f07d7533b232945fc61b69819d4a6b13d76d2..796a395a17872dc9eb6d2d01cf0743bb4d8b18d3 100644 (file)
@@ -197,6 +197,8 @@ global:
         sd_memfd_set_size;
 
         /* sd-event functions */
         sd_memfd_set_size;
 
         /* sd-event functions */
+        sd_event_default;
+
         sd_event_new;
         sd_event_ref;
         sd_event_unref;
         sd_event_new;
         sd_event_ref;
         sd_event_unref;
@@ -213,15 +215,17 @@ global:
         sd_event_loop;
 
         sd_event_get_state;
         sd_event_loop;
 
         sd_event_get_state;
+        sd_event_get_tid;
         sd_event_get_quit;
         sd_event_request_quit;
         sd_event_get_now_realtime;
         sd_event_get_now_monotonic;
         sd_event_get_quit;
         sd_event_request_quit;
         sd_event_get_now_realtime;
         sd_event_get_now_monotonic;
-        sd_event_get;
 
         sd_event_source_ref;
         sd_event_source_unref;
 
 
         sd_event_source_ref;
         sd_event_source_unref;
 
+        sd_event_get;
+
         sd_event_source_set_prepare;
         sd_event_source_get_pending;
         sd_event_source_get_priority;
         sd_event_source_set_prepare;
         sd_event_source_get_pending;
         sd_event_source_get_priority;
index 97e6db289bfe54b10f738bedbf33fe77c02059d8..8025d24bb7e34d1f0c0b3e7b1b6e7d7dc0c651d6 100644 (file)
 #include <sys/timerfd.h>
 #include <sys/wait.h>
 
 #include <sys/timerfd.h>
 #include <sys/wait.h>
 
+#include "sd-id128.h"
 #include "macro.h"
 #include "prioq.h"
 #include "hashmap.h"
 #include "util.h"
 #include "time-util.h"
 #include "macro.h"
 #include "prioq.h"
 #include "hashmap.h"
 #include "util.h"
 #include "time-util.h"
-#include "sd-id128.h"
+#include "missing.h"
 
 #include "sd-event.h"
 
 
 #include "sd-event.h"
 
@@ -138,6 +139,9 @@ struct sd_event {
 
         bool quit_requested:1;
         bool need_process_child:1;
 
         bool quit_requested:1;
         bool need_process_child:1;
+
+        pid_t tid;
+        sd_event **default_event_ptr;
 };
 
 static int pending_prioq_compare(const void *a, const void *b) {
 };
 
 static int pending_prioq_compare(const void *a, const void *b) {
@@ -304,6 +308,9 @@ static int quit_prioq_compare(const void *a, const void *b) {
 static void event_free(sd_event *e) {
         assert(e);
 
 static void event_free(sd_event *e) {
         assert(e);
 
+        if (e->default_event_ptr)
+                *(e->default_event_ptr) = NULL;
+
         if (e->epoll_fd >= 0)
                 close_nointr_nofail(e->epoll_fd);
 
         if (e->epoll_fd >= 0)
                 close_nointr_nofail(e->epoll_fd);
 
@@ -1869,3 +1876,38 @@ _public_ int sd_event_get_now_monotonic(sd_event *e, uint64_t *usec) {
         *usec = e->timestamp.monotonic;
         return 0;
 }
         *usec = e->timestamp.monotonic;
         return 0;
 }
+
+_public_ int sd_event_default(sd_event **ret) {
+
+        static __thread sd_event *default_event = NULL;
+        sd_event *e;
+        int r;
+
+        if (!ret)
+                return !!default_event;
+
+        if (default_event) {
+                *ret = sd_event_ref(default_event);
+                return 0;
+        }
+
+        r = sd_event_new(&e);
+        if (r < 0)
+                return r;
+
+        e->default_event_ptr = &default_event;
+        e->tid = gettid();
+        default_event = e;
+
+        *ret = e;
+        return 1;
+}
+
+_public_ int sd_event_get_tid(sd_event *e, pid_t *tid) {
+        assert_return(e, -EINVAL);
+        assert_return(tid, -EINVAL);
+        assert_return(e->tid != 0, -ENXIO);
+
+        *tid = e->tid;
+        return 0;
+}
index 65c1c296f8babc19a4649d99652a78faaf45649c..ba60a47a34fb706fdda8d7ae41aea71b8620855d 100644 (file)
@@ -163,7 +163,7 @@ int main(int argc, char *argv[]) {
         assert_se(pipe(b) >= 0);
         assert_se(pipe(d) >= 0);
 
         assert_se(pipe(b) >= 0);
         assert_se(pipe(d) >= 0);
 
-        assert_se(sd_event_new(&e) >= 0);
+        assert_se(sd_event_default(&e) >= 0);
 
         got_a = false, got_b = false, got_c = false, got_d = 0;
 
 
         got_a = false, got_b = false, got_c = false, got_d = 0;
 
index 7e03d82575ab0f9cd823b6644c8f4e86e4ece153..32d52a90a20a0addba53a87afcd0a5f90c446356 100644 (file)
@@ -1115,7 +1115,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
                 goto finish;
         }
 
-        r = sd_event_new(&event);
+        r = sd_event_default(&event);
         if (r < 0) {
                 log_error("Failed to allocate event loop: %s", strerror(-r));
                 goto finish;
         if (r < 0) {
                 log_error("Failed to allocate event loop: %s", strerror(-r));
                 goto finish;
index c4227f16b2b4a8a45e3d1f4a33eba19c71518f18..b54689e1d55ee8d4bd6930ae85127751bba3239e 100644 (file)
@@ -90,7 +90,7 @@ Manager *manager_new(void) {
                 return NULL;
         }
 
                 return NULL;
         }
 
-        r = sd_event_new(&m->event);
+        r = sd_event_default(&m->event);
         if (r < 0) {
                 manager_free(m);
                 return NULL;
         if (r < 0) {
                 manager_free(m);
                 return NULL;
index d6dd984e7673947a34bfa4c75f2dc7c29be9d739..ee6a6d6aeb60dc61f2a0410567f0101e955bfdfe 100644 (file)
@@ -53,7 +53,7 @@ Manager *manager_new(void) {
                 return NULL;
         }
 
                 return NULL;
         }
 
-        r = sd_event_new(&m->event);
+        r = sd_event_default(&m->event);
         if (r < 0) {
                 manager_free(m);
                 return NULL;
         if (r < 0) {
                 manager_free(m);
                 return NULL;
index 6a57a80147c1a0fddbb664ceb792e1b4d964e463..8378e92a81e150ade9fc530ef876adff1bdd946d 100644 (file)
@@ -31,7 +31,7 @@ int manager_new(Manager **ret) {
         if (!m)
                 return -ENOMEM;
 
         if (!m)
                 return -ENOMEM;
 
-        r = sd_event_new(&m->event);
+        r = sd_event_default(&m->event);
         if (r < 0)
                 return r;
 
         if (r < 0)
                 return r;
 
index 56e660de57cb6b50cddd7b2d4c4a64ce22309c55..8cba8e06798e80eef0e963e7ec8a1644b22b7613 100644 (file)
@@ -626,7 +626,7 @@ int main(int argc, char *argv[]) {
         if (r <= 0)
                 goto finish;
 
         if (r <= 0)
                 goto finish;
 
-        r = sd_event_new(&event);
+        r = sd_event_default(&event);
         if (r < 0) {
                 log_error("Failed to allocate event loop: %s", strerror(-r));
                 goto finish;
         if (r < 0) {
                 log_error("Failed to allocate event loop: %s", strerror(-r));
                 goto finish;
index 8262e139ac77beac61aae0a3e545cd9f7712a97f..919b661d61189dd43a6bbe47e223c9cbbbfe7b00 100644 (file)
@@ -72,6 +72,8 @@ typedef int (*sd_defer_handler_t)(sd_event_source *s, void *userdata);
 typedef int (*sd_prepare_handler_t)(sd_event_source *s, void *userdata);
 typedef int (*sd_quit_handler_t)(sd_event_source *s, void *userdata);
 
 typedef int (*sd_prepare_handler_t)(sd_event_source *s, void *userdata);
 typedef int (*sd_quit_handler_t)(sd_event_source *s, void *userdata);
 
+int sd_event_default(sd_event **e);
+
 int sd_event_new(sd_event **e);
 sd_event* sd_event_ref(sd_event *e);
 sd_event* sd_event_unref(sd_event *e);
 int sd_event_new(sd_event **e);
 sd_event* sd_event_ref(sd_event *e);
 sd_event* sd_event_unref(sd_event *e);
@@ -88,15 +90,17 @@ int sd_event_run(sd_event *e, uint64_t timeout);
 int sd_event_loop(sd_event *e);
 
 int sd_event_get_state(sd_event *e);
 int sd_event_loop(sd_event *e);
 
 int sd_event_get_state(sd_event *e);
+int sd_event_get_tid(sd_event *e, pid_t *tid);
 int sd_event_get_quit(sd_event *e);
 int sd_event_request_quit(sd_event *e);
 int sd_event_get_now_realtime(sd_event *e, uint64_t *usec);
 int sd_event_get_now_monotonic(sd_event *e, uint64_t *usec);
 int sd_event_get_quit(sd_event *e);
 int sd_event_request_quit(sd_event *e);
 int sd_event_get_now_realtime(sd_event *e, uint64_t *usec);
 int sd_event_get_now_monotonic(sd_event *e, uint64_t *usec);
-sd_event *sd_event_get(sd_event_source *s);
 
 sd_event_source* sd_event_source_ref(sd_event_source *s);
 sd_event_source* sd_event_source_unref(sd_event_source *s);
 
 
 sd_event_source* sd_event_source_ref(sd_event_source *s);
 sd_event_source* sd_event_source_unref(sd_event_source *s);
 
+sd_event *sd_event_get(sd_event_source *s);
+
 int sd_event_source_set_prepare(sd_event_source *s, sd_prepare_handler_t callback);
 int sd_event_source_get_pending(sd_event_source *s);
 int sd_event_source_get_priority(sd_event_source *s, int *priority);
 int sd_event_source_set_prepare(sd_event_source *s, sd_prepare_handler_t callback);
 int sd_event_source_get_pending(sd_event_source *s);
 int sd_event_source_get_priority(sd_event_source *s, int *priority);
index 163b2761ac01792ce949f18fe7001044b1930630..8fb7f6e806a785a1da052ef20ef0760f086ad28a 100644 (file)
@@ -854,7 +854,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
                 goto finish;
         }
 
-        r = sd_event_new(&event);
+        r = sd_event_default(&event);
         if (r < 0) {
                 log_error("Failed to allocate event loop: %s", strerror(-r));
                 goto finish;
         if (r < 0) {
                 log_error("Failed to allocate event loop: %s", strerror(-r));
                 goto finish;