jobs: Switch back to sd_event 61/14361/1
authorjobol <jose.bollo@iot.bzh>
Mon, 11 Jun 2018 14:54:37 +0000 (16:54 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Wed, 13 Jun 2018 15:15:46 +0000 (17:15 +0200)
Change-Id: I8c9de83d857844b1c5d0d2d26385dbf19fcae228
Signed-off-by: jobol <jose.bollo@iot.bzh>
src/afb-fdev.c
src/jobs.c

index 1c36091..2c96ef5 100644 (file)
@@ -17,7 +17,7 @@
 
 #include "fdev.h"
 
-#if defined(WITH_SYSTEMD_EVENT)
+#if !defined(REMOVE_SYSTEMD_EVENT)
 #   define USE_SYSTEMD 1
 #   define USE_EPOLL   0
 #else
index d71e5d0..5980305 100644 (file)
 #endif
 
 #include "jobs.h"
-#include "fdev-epoll.h"
 #include "sig-monitor.h"
 #include "verbose.h"
-
+#include "fdev-epoll.h"
 #if 0
 #define _alert_ "do you really want to remove signal monitoring?"
 #define sig_monitor_init_timeouts()  ((void)0)
@@ -133,6 +132,9 @@ static struct job *free_jobs;
 /* event loop */
 static struct evloop evloop[1];
 static struct fdev_epoll *fdevepoll;
+#if !defined(REMOVE_SYSTEMD_EVENT)
+__attribute__((unused))
+#endif
 static int waitevt;
 
 /**
@@ -336,6 +338,9 @@ static void evloop_run(int signum, void *arg)
  *               flow
  * @param arg     the events to run
  */
+#if !defined(REMOVE_SYSTEMD_EVENT)
+__attribute__((unused))
+#endif
 static void monitored_wait_and_dispatch(int signum, void *arg)
 {
        struct fdev_epoll *fdev_epoll = arg;
@@ -355,6 +360,9 @@ static void thread_run(volatile struct thread *me)
 {
        struct thread **prv;
        struct job *job;
+#if !defined(REMOVE_SYSTEMD_EVENT)
+       struct evloop *el;
+#endif
 
        /* initialize description of itself and link it in the list */
        me->tid = pthread_self();
@@ -392,6 +400,28 @@ static void thread_run(volatile struct thread *me)
 
                        /* release the run job */
                        job_release(job);
+#if !defined(REMOVE_SYSTEMD_EVENT)
+               } else {
+                       /* no job, check events */
+                       el = &evloop[0];
+                       if (el->sdev && !__atomic_load_n(&el->state, __ATOMIC_RELAXED)) {
+                               /* run the events */
+                               __atomic_store_n(&el->state, EVLOOP_STATE_LOCK|EVLOOP_STATE_RUN|EVLOOP_STATE_WAIT, __ATOMIC_RELAXED);
+                               current_evloop = el;
+                               pthread_mutex_unlock(&mutex);
+                               sig_monitor(0, evloop_run, el);
+                               pthread_mutex_lock(&mutex);
+                       } else {
+                               /* no job and not events */
+                               running--;
+                               if (!running)
+                                       ERROR("Entering job deep sleep! Check your bindings.");
+                               me->waits = 1;
+                               pthread_cond_wait(&cond, &mutex);
+                               me->waits = 0;
+                               running++;
+                       }
+#else
                } else if (waitevt) {
                        /* no job and not events */
                        running--;
@@ -408,6 +438,7 @@ static void thread_run(volatile struct thread *me)
                        sig_monitor(0, monitored_wait_and_dispatch, get_fdevepoll());
                        pthread_mutex_lock(&mutex);
                        waitevt = 0;
+#endif
                }
        }
 
@@ -691,6 +722,9 @@ static int on_evloop_efd(sd_event_source *s, int fd, uint32_t revents, void *use
 }
 
 /* temporary hack */
+#if !defined(REMOVE_SYSTEMD_EVENT)
+__attribute__((unused))
+#endif
 static void evloop_callback(void *arg, uint32_t event, struct fdev *fdev)
 {
        sig_monitor(0, evloop_run, arg);
@@ -727,6 +761,15 @@ static struct sd_event *get_sd_event_locked()
                rc = sd_event_add_io(el->sdev, NULL, el->efd, EPOLLIN, on_evloop_efd, el);
                if (rc < 0) {
                        ERROR("can't register eventfd");
+#if !defined(REMOVE_SYSTEMD_EVENT)
+                       sd_event_unref(el->sdev);
+                       el->sdev = NULL;
+error2:
+                       close(el->efd);
+error1:
+                       return NULL;
+               }
+#else
                        goto error3;
                }
                /* handle the event loop */
@@ -744,6 +787,7 @@ error1:
                fdev_set_autoclose(el->fdev, 0);
                fdev_set_events(el->fdev, EPOLLIN);
                fdev_set_callback(el->fdev, evloop_callback, el);
+#endif
        }
 
        /* attach the event loop to the current thread */