[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