+ void (*callback)(int, void*),
+ void *arg)
+{
+ return queue_job(group, timeout, callback, arg, 1);
+}
+
+/**
+ * Internal helper function for 'jobs_enter'.
+ * @see jobs_enter, jobs_leave
+ */
+static void enter_cb(int signum, void *closure)
+{
+ struct sync *sync = closure;
+ sync->enter(signum, sync->arg, (void*)&sync->thread);
+}
+
+/**
+ * Internal helper function for 'jobs_call'.
+ * @see jobs_call
+ */
+static void call_cb(int signum, void *closure)
+{
+ struct sync *sync = closure;
+ sync->callback(signum, sync->arg);
+ jobs_leave((void*)&sync->thread);
+}
+
+/**
+ * Internal helper for synchronous jobs. It enters
+ * a new thread loop for evaluating the given job
+ * as recorded by the couple 'sync_cb' and 'sync'.
+ * @see jobs_call, jobs_enter, jobs_leave
+ */
+static int do_sync(
+ const void *group,
+ int timeout,
+ void (*sync_cb)(int signum, void *closure),
+ struct sync *sync
+)