On Sun, 05.06.16 13:03, Ben-melech, Shiran ([email protected]) wrote:

> I've added mutex locks over all the sd functions using the bus as well
> as around the event loop.
> 
> This is how i run the event loop inside the pthread:
>         
> while (sd_event_get_state(event) != SD_EVENT_FINISHED) {
>        
> pthread_mutex_lock (&lock);
>         sd_event_run(event, 1000);
>        
> pthread_mutex_unlock (&lock);
>         if (r < 0) {
>               sd_eve
> nt_get_exit_code(event, &r);
>                 syslog(LOG_ERR, "%s: Error
> sd_event_run with     code %d", __FUNCTION__, r);
>                
> return NULL;
>         }
>       sched_yield();
> }
> 
> This did solve the seg faults and deadlocks but the callbacks are missed and 
> never called. In addition the execution is extremely slow since the event 
> loop is catching the lock most of the time.

You have to lock around all functions of sd-event you call.  That
includes sd_event_get_state() and sd_event_get_exit_code().

If you want to unlock the mutex while sd-event is waiting for events,
I'd recommend using sd_event_get_fd() and poll()ing on the returned fd
instead of ever calling sd_event_run() or sd_event_wait().

But the rule is really: if you want to access the same sd_event object
from multiple threads, you have to comprehensively lock around it.

Lennart

-- 
Lennart Poettering, Red Hat
_______________________________________________
systemd-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to