diff options
-rw-r--r-- | nuttx/sched/Makefile | 2 | ||||
-rw-r--r-- | nuttx/sched/group_leave.c | 6 | ||||
-rw-r--r-- | nuttx/sched/pthread_internal.h | 1 | ||||
-rw-r--r-- | nuttx/sched/pthread_keydelete.c | 2 | ||||
-rw-r--r-- | nuttx/sched/pthread_release.c | 123 |
5 files changed, 129 insertions, 5 deletions
diff --git a/nuttx/sched/Makefile b/nuttx/sched/Makefile index 780549abf..6a9c62d29 100644 --- a/nuttx/sched/Makefile +++ b/nuttx/sched/Makefile @@ -146,7 +146,7 @@ PTHREAD_SRCS += pthread_barrierinit.c pthread_barrierdestroy.c pthread_barrierwa PTHREAD_SRCS += pthread_cancel.c pthread_setcancelstate.c PTHREAD_SRCS += pthread_keycreate.c pthread_setspecific.c pthread_getspecific.c pthread_keydelete.c PTHREAD_SRCS += pthread_initialize.c pthread_completejoin.c pthread_findjoininfo.c -PTHREAD_SRCS += pthread_once.c pthread_setschedprio.c +PTHREAD_SRCS += pthread_once.c pthread_release.c pthread_setschedprio.c ifneq ($(CONFIG_DISABLE_SIGNALS),y) PTHREAD_SRCS += pthread_condtimedwait.c pthread_kill.c pthread_sigmask.c diff --git a/nuttx/sched/group_leave.c b/nuttx/sched/group_leave.c index d87420d1c..1373a25a2 100644 --- a/nuttx/sched/group_leave.c +++ b/nuttx/sched/group_leave.c @@ -154,10 +154,10 @@ static inline void group_release(FAR struct task_group_s *group) group_removechildren(group); #endif - /* Free pthread join data */ - #ifndef CONFIG_DISABLE_PTHREAD - (void)sem_destroy(&group->tg_joinsem); + /* Release pthread resources */ + + pthread_release(group); #endif /* Free all file-related resources now. We really need to close files as diff --git a/nuttx/sched/pthread_internal.h b/nuttx/sched/pthread_internal.h index b5c4c3743..0b4adf758 100644 --- a/nuttx/sched/pthread_internal.h +++ b/nuttx/sched/pthread_internal.h @@ -101,6 +101,7 @@ void pthread_destroyjoin(FAR struct task_group_s *group, FAR struct join_s *pjoin); FAR struct join_s *pthread_findjoininfo(FAR struct task_group_s *group, pid_t pid); +void pthread_release(FAR struct task_group_s *group); int pthread_givesemaphore(sem_t *sem); int pthread_takesemaphore(sem_t *sem); diff --git a/nuttx/sched/pthread_keydelete.c b/nuttx/sched/pthread_keydelete.c index d55a448ed..0cbf950c0 100644 --- a/nuttx/sched/pthread_keydelete.c +++ b/nuttx/sched/pthread_keydelete.c @@ -81,7 +81,7 @@ * key = the key to delete * * Return Value: - * Always returns ENOSYSL. + * Always returns ENOSYS. * * Assumptions: * diff --git a/nuttx/sched/pthread_release.c b/nuttx/sched/pthread_release.c new file mode 100644 index 000000000..6b99b455e --- /dev/null +++ b/nuttx/sched/pthread_release.c @@ -0,0 +1,123 @@ +/************************************************************************ + * sched/pthread_release.c + * + * Copyright (C) 2013 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************/ + +/************************************************************************ + * Included Files + ************************************************************************/ + +#include <nuttx/config.h> + +#include <sched.h> +#include <debug.h> + +#include "os_internal.h" +#include "pthread_internal.h" + +/************************************************************************ + * Definitions + ************************************************************************/ + +/************************************************************************ + * Private Type Declarations + ************************************************************************/ + +/************************************************************************ + * Global Variables + ************************************************************************/ + +/************************************************************************ + * Private Variables + ************************************************************************/ + +/************************************************************************ + * Private Functions + ************************************************************************/ + +/************************************************************************ + * Public Functions + ************************************************************************/ + +/************************************************************************ + * Name: pthread_release + * + * Description: + * Release pthread resources from the task group with the group + * terminated. + * + * Parameters: + * group = The task group containing the pthread resources to be + * released. + * + * Return Value: + * None + * + * Assumptions: + * + * POSIX Compatibility: + * + ************************************************************************/ + +void pthread_release(FAR struct task_group_s *group) +{ + FAR struct join_s *join; + + sdbg("group=0x%p\n", group); + + /* Visit and delete each join structure still in the list. Since we + * are last exiting thread of the group, no special protection should + * be required. + */ + + while (group->tg_joinhead) + { + /* Remove the join from the head of the list. */ + + join = group->tg_joinhead; + group->tg_joinhead = join->next; + + /* Destroy the join semaphores */ + + (void)sem_destroy(&join->data_sem); + (void)sem_destroy(&join->exit_sem); + + /* And deallocate the join structure */ + + sched_free(join); + } + + /* Destroy the join list semaphore */ + + (void)sem_destroy(&group->tg_joinsem); +} |