From fdaa22ed2d565e49983e956bc056f1e0797bd9a9 Mon Sep 17 00:00:00 2001 From: patacongo Date: Fri, 25 Jan 2013 20:00:37 +0000 Subject: Add logic to send SIGCHLD to all members of a task group git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5564 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/ChangeLog | 5 ++ nuttx/include/nuttx/sched.h | 2 +- nuttx/sched/Makefile | 6 +- nuttx/sched/group_signal.c | 135 ++++++++++++++++++++++++++++++++++++++++++++ nuttx/sched/os_internal.h | 14 ++++- nuttx/sched/task_exithook.c | 4 ++ 6 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 nuttx/sched/group_signal.c (limited to 'nuttx') diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index 2eaa03b21..f033fc9ba 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -4025,3 +4025,8 @@ poll_interrupt() must cat call net_lostconnection() when a loss of connection is reported. Otherwise, the system will not know that the connection has been lost. + * sched/group_create.c, group_join.c, and group_leave.c: Add + support for task groups. + * sched/group_signal.c and task_exithook.c: Send signal to all + members for the parent task group. + diff --git a/nuttx/include/nuttx/sched.h b/nuttx/include/nuttx/sched.h index a29f8dfeb..2795751ab 100644 --- a/nuttx/include/nuttx/sched.h +++ b/nuttx/include/nuttx/sched.h @@ -70,7 +70,7 @@ /* In any event, we don't need group members if support for pthreads is disabled */ -#ifdef CONFIG_PTHREADS_DISABLE +#ifdef CONFIG_DISABLE_PTHREAD # undef HAVE_GROUP_MEMBERS #endif diff --git a/nuttx/sched/Makefile b/nuttx/sched/Makefile index 6a710ff95..bbf513f34 100644 --- a/nuttx/sched/Makefile +++ b/nuttx/sched/Makefile @@ -87,7 +87,11 @@ SCHED_SRCS += sched_waitid.c sched_wait.c endif endif -GRP_SRCS = group_create.c group_join.c group_leave.c +GRP_SRCS = group_create.c group_join.c group_leave.c + +ifneq ($(CONFIG_DISABLE_SIGNALS),y) +GRP_SRCS += group_signal.c +endif ENV_SRCS = env_getenvironptr.c env_dup.c env_share.c env_release.c ENV_SRCS += env_findvar.c env_removevar.c diff --git a/nuttx/sched/group_signal.c b/nuttx/sched/group_signal.c new file mode 100644 index 000000000..68912fe00 --- /dev/null +++ b/nuttx/sched/group_signal.c @@ -0,0 +1,135 @@ +/***************************************************************************** + * sched/group_signal.c + * + * Copyright (C) 2013 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 + +#include +#include +#include +#include + +#include "sig_internal.h" + +#if defined(HAVE_TASK_GROUP) && !defined(CONFIG_DISABLE_SIGNALS) + +/***************************************************************************** + * Pre-processor Definitions + *****************************************************************************/ + +/***************************************************************************** + * Private Types + *****************************************************************************/ + +/***************************************************************************** + * Private Data + *****************************************************************************/ + +/***************************************************************************** + * Private Functions + *****************************************************************************/ + +/***************************************************************************** + * Public Functions + *****************************************************************************/ + +/***************************************************************************** + * Name: group_signal + * + * Description: + * Send a signal to every member of the group to which task belongs. + * + * Parameters: + * tcb - The tcb of one task in the task group that needs to be signalled. + * + * Return Value: + * 0 (OK) on success; a negated errno value on failure. + * + * Assumptions: + * Called during task terminatino in a safe context. No special precautions + * are required here. + * + *****************************************************************************/ + +int group_signal(FAR _TCB *tcb, FAR siginfo_t *info) +{ +#ifdef HAVE_GROUP_MEMBERS + FAR struct task_group_s *group; + FAR _TCB *gtcb; + int i; + + DEBUGASSERT(tcb && tcb->group && info); + group = tcb->group; + + /* Make sure that pre-emption is disabled to that we signal all of teh + * members of the group before any of them actually run. + */ + + sched_lock(); + + /* Send the signal to each member of the group */ + + for (i = 0; i < group->tg_nmembers; i++) + { + gtcb = sched_gettcb(group->tg_members[i]); + DEBUGASSERT(gtcb); + if (gtcb) + { + /* Use the sig_received interface so that it does not muck with + * the siginfo_t. + */ + +#ifdef CONFIG_DEBUG + int ret = sig_received(gtcb, info); + DEBUGASSERT(ret == 0); +#else + (void)sig_received(gtcb, info); +#endif + } + } + + /* Re-enable pre-emption an return success */ + + sched_unlock(); + return OK; +#else + return sig_received(tcb, info); +#endif +} + +#endif /* HAVE_TASK_GROUP && !CONFIG_DISABLE_SIGNALS */ diff --git a/nuttx/sched/os_internal.h b/nuttx/sched/os_internal.h index 8ce99bc44..599be25bb 100644 --- a/nuttx/sched/os_internal.h +++ b/nuttx/sched/os_internal.h @@ -275,13 +275,21 @@ int task_reparent(pid_t ppid, pid_t chpid); #ifdef HAVE_TASK_GROUP int group_allocate(FAR _TCB *tcb); int group_initialize(FAR _TCB *tcb); +int group_bind(FAR _TCB *tcb); int group_join(FAR _TCB *tcb); void group_leave(FAR _TCB *tcb); +#ifndef CONFIG_DISABLE_SIGNALS +int group_signal(FAR _TCB *tcb, FAR siginfo_t *info); +#else +# define group_signal(tcb,info) (0) +#endif #else -# define group_allocate(tcb) (0) -# define group_initialize(tcb) (0) -# define group_join(tcb) (0) +# define group_allocate(tcb) (0) +# define group_initialize(tcb) (0) +# define group_bind(tcb) (0) +# define group_join(tcb) (0) # define group_leave(tcb) +# define group_signal(tcb,info) (0) #endif #ifdef CONFIG_SCHED_CHILD_STATUS diff --git a/nuttx/sched/task_exithook.c b/nuttx/sched/task_exithook.c index 36836301c..2d596978f 100644 --- a/nuttx/sched/task_exithook.c +++ b/nuttx/sched/task_exithook.c @@ -259,7 +259,11 @@ static inline void task_sigchild(FAR _TCB *ptcb, FAR _TCB *ctcb, int status) * can provide the correct si_code value with the signal. */ +#ifdef HAVE_GROUP_MEMBERS + (void)group_signal(ptcb, &info); +#else (void)sig_received(ptcb, &info); +#endif } } #else -- cgit v1.2.3