From: Lennart Poettering Date: Wed, 30 Oct 2019 19:26:50 +0000 (+0100) Subject: sd-event: refuse running default event loops in any other thread than the one they... X-Git-Tag: v245-rc1~315^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F13886%2Fhead;p=thirdparty%2Fsystemd.git sd-event: refuse running default event loops in any other thread than the one they are default for --- diff --git a/TODO b/TODO index 88fd9d7f106..07f65ec80e9 100644 --- a/TODO +++ b/TODO @@ -701,7 +701,6 @@ Features: - allow multiple signal handlers per signal? - document chaining of signal handler for SIGCHLD and child handlers - define more intervals where we will shift wakeup intervals around in, 1h, 6h, 24h, ... - - generate a failure of a default event loop is executed out-of-thread * investigate endianness issues of UUID vs. GUID diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index 8d4a20e420f..49403457911 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -3422,6 +3422,11 @@ _public_ int sd_event_prepare(sd_event *e) { assert_return(e->state != SD_EVENT_FINISHED, -ESTALE); assert_return(e->state == SD_EVENT_INITIAL, -EBUSY); + /* Let's check that if we are a default event loop we are executed in the correct thread. We only do + * this check here once, since gettid() is typically not cached, and thus want to minimize + * syscalls */ + assert_return(!e->default_event_ptr || e->tid == gettid(), -EREMOTEIO); + if (e->exit_requested) goto pending;