[PATCH] score: Fix POSIX thread join
Gedare Bloom
gedare at rtems.org
Thu Apr 23 19:16:34 UTC 2015
On Thu, Apr 23, 2015 at 3:09 PM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
>
> ----- Gedare Bloom <gedare at rtems.org> schrieb:
>> On Thu, Apr 23, 2015 at 9:30 AM, Sebastian Huber
>> <sebastian.huber at embedded-brains.de> wrote:
>> > A thread join twofold. One side uses a thread queue and the other not.
>> > So we must not use the same state.
>> >
>> > Update #2035.
>> > ---
>> > cpukit/libmisc/monitor/mon-prmisc.c | 1 +
>> > cpukit/posix/src/pthreadjoin.c | 2 +-
>> > cpukit/score/include/rtems/score/statesimpl.h | 4 +++-
>> > 3 files changed, 5 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/cpukit/libmisc/monitor/mon-prmisc.c b/cpukit/libmisc/monitor/mon-prmisc.c
>> > index ff54d79..f981a4e 100644
>> > --- a/cpukit/libmisc/monitor/mon-prmisc.c
>> > +++ b/cpukit/libmisc/monitor/mon-prmisc.c
>> > @@ -138,6 +138,7 @@ static const rtems_assoc_t rtems_monitor_state_assoc[] = {
>> > { "ZOMBI", STATES_ZOMBIE, 0 },
>> > { "MIGRA", STATES_MIGRATING, 0 },
>> > { "RESTA", STATES_RESTARTING, 0 },
>> > + { "Wjoin", STATES_WAITING_FOR_JOIN, 0 },
>> Does the order matter here, or can the state be located next to "Wjatx"?
>>
>
> Ok.
>
>> > { 0, 0, 0 },
>> > };
>> >
>> > diff --git a/cpukit/posix/src/pthreadjoin.c b/cpukit/posix/src/pthreadjoin.c
>> > index 99cc4d3..e2b1664 100644
>> > --- a/cpukit/posix/src/pthreadjoin.c
>> > +++ b/cpukit/posix/src/pthreadjoin.c
>> > @@ -71,7 +71,7 @@ on_EINTR:
>> > _Thread_queue_Enqueue(
>> > &api->Join_List,
>> > executing,
>> > - STATES_WAITING_FOR_JOIN_AT_EXIT | STATES_INTERRUPTIBLE_BY_SIGNAL,
>> > + STATES_WAITING_FOR_JOIN | STATES_INTERRUPTIBLE_BY_SIGNAL,
>> > WATCHDOG_NO_TIMEOUT
>> > );
>> > }
>> > diff --git a/cpukit/score/include/rtems/score/statesimpl.h b/cpukit/score/include/rtems/score/statesimpl.h
>> > index 074b352..9f94675 100644
>> > --- a/cpukit/score/include/rtems/score/statesimpl.h
>> > +++ b/cpukit/score/include/rtems/score/statesimpl.h
>> > @@ -84,6 +84,8 @@ extern "C" {
>> > #define STATES_MIGRATING 0x400000
>> > /** This macro corresponds to a task restarting. */
>> > #define STATES_RESTARTING 0x800000
>> > +/** This macro corresponds to a task waiting for a join. */
>> > +#define STATES_WAITING_FOR_JOIN 0x1000000
>> >
>> > /** This macro corresponds to a task which is in an interruptible
>> > * blocking state.
>> > @@ -97,7 +99,7 @@ extern "C" {
>> > STATES_WAITING_FOR_SEMAPHORE | \
>> > STATES_WAITING_FOR_MUTEX | \
>> > STATES_WAITING_FOR_CONDITION_VARIABLE | \
>> > - STATES_WAITING_FOR_JOIN_AT_EXIT | \
>> > + STATES_WAITING_FOR_JOIN | \
>> Is it right to remove WAITING_FOR_JOIN_AT_EXIT here?
>
> Yes, this is the key point of the patch. The join is twofold. There is one thread that exists and an arbitrary number of threads that wait for the thread exit (one-to-many relation). The exitting thread may want to wait for a thread that wants to join its exit (STATES_WAITING_FOR_JOIN_AT_EXIT in _POSIX_Thread_Exit()). On the other side we need a thread queue for all the threads that wait for the exit (STATES_WAITING_FOR_JOIN in pthread_join()).
>
OK thanks this explanation would be useful somewhere, maybe just to
clarify the commit message a little bit more.
Gedare
More information about the devel
mailing list