summary |
shortlog |
log |
commit | commitdiff |
review |
tree
raw |
patch |
inline | side by side (from parent 1:
a221b08)
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
struct events *next;
struct sd_event *event;
uint64_t timeout;
struct events *next;
struct sd_event *event;
uint64_t timeout;
static inline struct events *events_get()
{
struct events *events = first_events;
static inline struct events *events_get()
{
struct events *events = first_events;
- while (events && events->runs)
+ while (events && events->used)
events = events->next;
return events;
}
events = events->next;
return events;
}
*/
static void thread_run(volatile struct thread *me)
{
*/
static void thread_run(volatile struct thread *me)
{
+ struct thread **prv, *thr;
struct job *job;
struct events *events;
uint64_t evto;
struct job *job;
struct events *events;
uint64_t evto;
/* release event if any */
events = me->events;
if (events) {
/* release event if any */
events = me->events;
if (events) {
me->events = NULL;
}
} else {
/* no job, check events */
me->events = NULL;
}
} else {
/* no job, check events */
- events = events_get();
- if (events) {
+ thr = (struct thread*)me;
+ events = NULL;
+ while (thr && !(events = thr->events))
+ thr = thr->upper;
+ if (events && !events->runs) {
/* run the events */
events->runs = 1;
events->timeout = evto;
/* run the events */
events->runs = 1;
events->timeout = evto;
events->runs = 0;
me->events = NULL;
} else {
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--;
+ /* 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--;
+ }
events = malloc(sizeof *events);
if (events && (rc = sd_event_new(&events->event)) >= 0) {
if (nevents < started || start_one_thread() >= 0) {
events = malloc(sizeof *events);
if (events && (rc = sd_event_new(&events->event)) >= 0) {
if (nevents < started || start_one_thread() >= 0) {
events->runs = 0;
events->next = first_events;
first_events = events;
events->runs = 0;
events->next = first_events;
first_events = events;
me->events = events;
} else {
WARNING("event returned for unknown thread!");
me->events = events;
} else {
WARNING("event returned for unknown thread!");