This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: POSIX timer callback context


Dan Jakubiec <djakubiec@yahoo.com> writes:

> I'm using a POSIX timer in my application that I
> created with timer_create().  It is configured to
> generate a SIGUSR1 signal when the timer expires, and
> to call a signal handler installed by my app's thread.
>  I also have several different tasks running that were
> all created with pthread_create().
> 
> When the timer expires, the signal handler gets
> executed, but it appears to be executing in a another
> thread's context (i.e. pthread_self() returns the
> handle for one of my other threads).  Furthermore, the
> thread that installed the handler is waiting in a
> pselect() call that never gets interrupted with EINTR.
> 
> This seems like a bug to me, but I wanted to pass this
> by the group before fixing it to make sure I wasn't
> missing anything.  Seems like there is a bit of a grey
> area in the POSIX docs about whether signals get
> delivered to the "process" or one of its "threads". 
> However, it seems that in eCos it would only make
> sense to deliver signals to the calling thread itself.
> 
> Does anyone have any background info on the eCos
> implementation of POSIX timers, or an opinion on how
> POSIX timer callbacks should be processed?

This is not a bug. The POSIX spec is fairly clear that these are
process-wide signals that will be delivered to any thread that has the
signal unmasked. There are lots of problems with doing thread-specific
signals here that the POSIX committee decided to avoid by
side-stepping the problem.

If you want to direct the signal to a specific thread then just make
sure that that thread is the only one with the signal unmasked. The
best way to ensure this is to mask it in the signal mask of main()
before creating any other threads, which will then inherit main()'s
mask, and unmask it in the target thread.


-- 
Nick Garnett                    eCos Kernel Architect
http://www.ecoscentric.com      The eCos and RedBoot experts


-- 
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]