struct events *next;
struct sd_event *event;
uint64_t timeout;
+ unsigned used: 1;
unsigned runs: 1;
};
static inline struct events *events_get()
{
struct events *events = first_events;
- while (events && events->runs)
+ while (events && events->used)
events = events->next;
return events;
}
*/
static void thread_run(volatile struct thread *me)
{
- struct thread **prv;
+ struct thread **prv, *thr;
struct job *job;
struct events *events;
uint64_t evto;
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);
/* release event if any */
events = me->events;
if (events) {
- events->runs = 0;
+ events->used = 0;
me->events = NULL;
}
} else {
/* no job, check events */
- events = events_get();
+ 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;
+ thr = me->upper;
+ while (thr && thr->events == events) {
+ thr->events = NULL;
+ thr = thr->upper;
+ }
} else {
/* no job and not events */
waiting++;
events = malloc(sizeof *events);
if (events && (rc = sd_event_new(&events->event)) >= 0) {
if (nevents < started || start_one_thread() >= 0) {
+ events->used = 0;
events->runs = 0;
events->next = first_events;
first_events = events;
}
}
if (events) {
- /* */
me = current;
if (me) {
- events->runs = 1;
+ events->used = 1;
me->events = events;
} else {
WARNING("event returned for unknown thread!");
* @param start The start routine to activate (can't be NULL)
* @return 0 in case of success or -1 in case of error.
*/
-int jobs_start(int allowed_count, int start_count, int waiter_count, void (*start)())
+int jobs_start(int allowed_count, int start_count, int waiter_count, void (*start)(int signum))
{
int rc, launched;
struct thread me;