[ECOS] Question about PThreads and signals
Alexander Aganichev
aaganichev@gmail.com
Fri Sep 18 13:45:00 GMT 2009
Hello,
Just wondering if the problem I'm running in is known or I'm doing
something wrong. I modified TCP/IP stack to send SIGIO signal to the
POSIX thread with pthread_kill like this:
==
#if 1 // SIGIO/FIOSETOWN
if (so->so_state & SS_ASYNC)
pthread_kill(so->so_pgid, SIGIO);
#endif
==
I also modified the code to properly set so_pgid field and double
check that. From the user code I have the following:
==
sigaddset( &signals, SIGIO );
pthread_sigmask( SIG_BLOCK, &signals, &oldSignals );
while ( pGlobalParams->State == EventTask_Running )
{
sigwait( &signals, &sig );
==
And sigwait() not wakes on the signal from TCP/IP stack. The root of
the problem seems to be in the cyg_sigqueue() code, which do the
following:
==
if( thread != NULL )
{
sigaddset( &thread->sigpending, signo );
// just wake the thread up now if it's blocked somewhere
if ((thread->sigpending & ~thread->sigmask) != 0)
{
thread->thread->set_asr_pending();
thread->thread->release();
}
}
==
I think that thread->sigmask should not be used non-inverted here, so
that's why my thread is not waked (have not tested the reverted
condition though). Can anyone please comment if I'm right? Thanks in
advance.
--
WBR, Alexander
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
More information about the Ecos-discuss
mailing list