Add logic to send SIGCHLD to all members of a task group

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5564 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo
2013-01-25 20:00:37 +00:00
parent a35fcc5970
commit c9752dfb87
6 changed files with 161 additions and 5 deletions
+5
View File
@@ -4025,3 +4025,8 @@
poll_interrupt() must cat call net_lostconnection() when a poll_interrupt() must cat call net_lostconnection() when a
loss of connection is reported. Otherwise, the system will loss of connection is reported. Otherwise, the system will
not know that the connection has been lost. 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.
+1 -1
View File
@@ -70,7 +70,7 @@
/* In any event, we don't need group members if support for pthreads is disabled */ /* 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 # undef HAVE_GROUP_MEMBERS
#endif #endif
+5 -1
View File
@@ -87,7 +87,11 @@ SCHED_SRCS += sched_waitid.c sched_wait.c
endif endif
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_getenvironptr.c env_dup.c env_share.c env_release.c
ENV_SRCS += env_findvar.c env_removevar.c ENV_SRCS += env_findvar.c env_removevar.c
+135
View File
@@ -0,0 +1,135 @@
/*****************************************************************************
* sched/group_signal.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 <assert.h>
#include <signal.h>
#include <debug.h>
#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 */
+11 -3
View File
@@ -275,13 +275,21 @@ int task_reparent(pid_t ppid, pid_t chpid);
#ifdef HAVE_TASK_GROUP #ifdef HAVE_TASK_GROUP
int group_allocate(FAR _TCB *tcb); int group_allocate(FAR _TCB *tcb);
int group_initialize(FAR _TCB *tcb); int group_initialize(FAR _TCB *tcb);
int group_bind(FAR _TCB *tcb);
int group_join(FAR _TCB *tcb); int group_join(FAR _TCB *tcb);
void group_leave(FAR _TCB *tcb); void group_leave(FAR _TCB *tcb);
#ifndef CONFIG_DISABLE_SIGNALS
int group_signal(FAR _TCB *tcb, FAR siginfo_t *info);
#else #else
# define group_allocate(tcb) (0) # define group_signal(tcb,info) (0)
# define group_initialize(tcb) (0) #endif
# define group_join(tcb) (0) #else
# 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_leave(tcb)
# define group_signal(tcb,info) (0)
#endif #endif
#ifdef CONFIG_SCHED_CHILD_STATUS #ifdef CONFIG_SCHED_CHILD_STATUS
+4
View File
@@ -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. * 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); (void)sig_received(ptcb, &info);
#endif
} }
} }
#else #else