jobs: add const qualifier for groups
[src/app-framework-binder.git] / src / jobs.c
index e3aa5c9..93e864f 100644 (file)
@@ -50,7 +50,7 @@ typedef void (*job_cb_t)(int, void*);
 struct job
 {
        struct job *next;    /**< link to the next job enqueued */
-       void *group;         /**< group of the request */
+       const void *group;   /**< group of the request */
        job_cb_t callback;   /**< processing callback */
        void *arg;           /**< argument */
        int timeout;         /**< timeout in second for processing the request */
@@ -125,7 +125,7 @@ static struct job *free_jobs;
  * @return the created job unblock or NULL when no more memory
  */
 static struct job *job_create(
-               void *group,
+               const void *group,
                int timeout,
                job_cb_t callback,
                void *arg)
@@ -164,7 +164,7 @@ end:
  */
 static void job_add(struct job *job)
 {
-       void *group;
+       const void *group;
        struct job *ijob, **pjob;
 
        /* prepare to add */
@@ -218,7 +218,7 @@ static inline struct events *events_get()
 static inline void job_release(struct job *job)
 {
        struct job *ijob, **pjob;
-       void *group;
+       const void *group;
 
        /* first unqueue the job */
        pjob = &first_job;
@@ -300,17 +300,18 @@ static void thread_run(volatile struct thread *me)
        if (current) {
                current->lowered = 1;
                evto = EVENT_TIMEOUT_CHILD;
+               me->events = current->events;
        } else {
                started++;
                sig_monitor_init_timeouts();
                evto = EVENT_TIMEOUT_TOP;
+               me->events = NULL;
        }
        me->next = threads;
        threads = (struct thread*)me;
        current = (struct thread*)me;
 
        /* loop until stopped */
-       me->events = NULL;
        while (!me->stop) {
                /* get a job */
                job = job_get(first_job);
@@ -336,43 +337,33 @@ static void thread_run(volatile struct thread *me)
                        }
                } else {
                        /* no job, check events */
-                       thr = (struct thread*)me;
-                       events = NULL;
-                       while (thr && !(events = thr->events))
-                               thr = thr->upper;
-                       if (events && !events->runs) {
+                       events = me->events;
+                       if (!events || events->runs)
+                               events = events_get();
+                       if (events) {
                                /* run the events */
+                               events->used = 1;
                                events->runs = 1;
                                events->timeout = evto;
                                me->events = events;
                                pthread_mutex_unlock(&mutex);
                                sig_monitor(0, events_call, events);
                                pthread_mutex_lock(&mutex);
+                               events->used = 0;
                                events->runs = 0;
                                me->events = NULL;
-                       } else {
-                               /* no owned event, check events */
-                               events = events_get();
-                               if (events) {
-                                       /* run the events */
-                                       events->used = 1;
-                                       events->runs = 1;
-                                       events->timeout = evto;
-                                       me->events = events;
-                                       pthread_mutex_unlock(&mutex);
-                                       sig_monitor(0, events_call, events);
-                                       pthread_mutex_lock(&mutex);
-                                       events->used = 0;
-                                       events->runs = 0;
-                                       me->events = NULL;
-                               } else {
-                                       /* no job and not events */
-                                       waiting++;
-                                       me->waits = 1;
-                                       pthread_cond_wait(&cond, &mutex);
-                                       me->waits = 0;
-                                       waiting--;
+                               thr = me->upper;
+                               while (thr && thr->events == events) {
+                                       thr->events = NULL;
+                                       thr = thr->upper;
                                }
+                       } else {
+                               /* no job and not events */
+                               waiting++;
+                               me->waits = 1;
+                               pthread_cond_wait(&cond, &mutex);
+                               me->waits = 0;
+                               waiting--;
                        }
                }
        }
@@ -442,7 +433,7 @@ static int start_one_thread()
  * @return 0 in case of success or -1 in case of error
  */
 int jobs_queue(
-               void *group,
+               const void *group,
                int timeout,
                void (*callback)(int, void*),
                void *arg)
@@ -524,7 +515,7 @@ static void call_cb(int signum, void *closure)
  * @see jobs_call, jobs_enter, jobs_leave
  */
 static int do_sync(
-               void *group,
+               const void *group,
                int timeout,
                void (*sync_cb)(int signum, void *closure),
                struct sync *sync
@@ -568,7 +559,7 @@ static int do_sync(
  * @return 0 on success or -1 in case of error
  */
 int jobs_enter(
-               void *group,
+               const void *group,
                int timeout,
                void (*callback)(int signum, void *closure, struct jobloop *jobloop),
                void *closure
@@ -620,7 +611,7 @@ int jobs_leave(struct jobloop *jobloop)
  * @return 0 in case of success or -1 in case of error
  */
 int jobs_call(
-               void *group,
+               const void *group,
                int timeout,
                void (*callback)(int, void*),
                void *arg)
@@ -683,7 +674,7 @@ struct sd_event *jobs_get_sd_event()
                                                ERROR("creation of sd_event failed: %m");
                                                events = NULL;
                                                errno = -rc;
-                                       } 
+                                       }
                                }
                        }
                }