[Xenomai] Issue in notifier_callback while threadobj_lock is being held (forge/mercury)

Matthias Schneider ma30002000 at yahoo.de
Sat Apr 26 10:58:31 CEST 2014

Hi all,

when threadobj_lock is being held and a thread suspension triggers a call of
notifier_callback, I am experiencing some issues. The scenario in my case
was a thread being started waiting on threadobj_wait_start()/wait_on_barrier()
while a thread suspension was already triggered. (In case the started thread is 
of lower priority than the starting thread, threadobj_start() will not wait
for it).

The problem I was experiencing (due to timing) was that threadobj_lock()
was called in notifier_callback(), failed because the mutex was already held
(by wait_on_barrier()) and thus did not set the threadobj->status variable, 
however, wait_on_barrier() had already unset the status variable before actually 
unlocking the mutex in pthread_cond_wait().

This caused threadobj_lock() in notifier_callback() return -EDEADLK and not 
doing anything, and threadobj_unlock() to assert on __threadobj_tag_unlocked(thobj)
due status not reflecting the locked state.

Additionally I see problems in notifier_callback() in general since it will
leave the threadobj unlocked on return regardless of its previos state.
I am not sure how to address this issue, I have helped myself by blocking 
SIGNOTIFY in wait_on_barrier(), but that is obviously an incomplete fix
(if it is any at all). Probably there are other situtions as well that could 
cause this behavior.

Any ideas on what to do about that? 

Thanks in advance,

More information about the Xenomai mailing list