From 2dfc5da16f3e3abc4b36413e8205e3dcd4df7928 Mon Sep 17 00:00:00 2001 From: patacongo Date: Wed, 1 Aug 2012 17:47:54 +0000 Subject: atexit() and on_exit() may now be configured to support multiple exit callbacks git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4995 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/sched/atexit.c | 88 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 21 deletions(-) (limited to 'nuttx/sched/atexit.c') diff --git a/nuttx/sched/atexit.c b/nuttx/sched/atexit.c index 2c9b89d92..f7d81bec2 100644 --- a/nuttx/sched/atexit.c +++ b/nuttx/sched/atexit.c @@ -1,4 +1,4 @@ -/************************************************************************ +/**************************************************************************** * sched/atexit.c * * Copyright (C) 2007, 2009, 2011-2012 Gregory Nutt. All rights reserved. @@ -31,11 +31,11 @@ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - ************************************************************************/ + ****************************************************************************/ -/************************************************************************ +/**************************************************************************** * Included Files - ************************************************************************/ + ****************************************************************************/ #include @@ -51,50 +51,95 @@ #ifdef CONFIG_SCHED_ATEXIT -/************************************************************************ +/**************************************************************************** * Pre-processor Definitions - ************************************************************************/ + ****************************************************************************/ -/************************************************************************ +/**************************************************************************** * Private Type Declarations - ************************************************************************/ + ****************************************************************************/ -/************************************************************************ +/**************************************************************************** * Global Variables - ************************************************************************/ + ****************************************************************************/ -/************************************************************************ +/**************************************************************************** * Private Variables - ************************************************************************/ + ****************************************************************************/ -/************************************************************************ +/**************************************************************************** * Private Function Prototypes - ************************************************************************/ + ****************************************************************************/ -/************************************************************************ +/**************************************************************************** * Private Functions - ************************************************************************/ + ****************************************************************************/ -/************************************************************************ +/**************************************************************************** * Public Functions - ************************************************************************/ + ****************************************************************************/ -/************************************************************************ +/**************************************************************************** * Name: atexit * * Description: * Registers a function to be called at program exit. + * The atexit() function registers the given function to be called + * at normal process termination, whether via exit or via return from + * the program's main(). + * + * NOTE: CONFIG_SCHED_ATEXIT must be defined to enable this function + * + * Limitiations in the current implementation: + * + * 1. Only a single atexit function can be registered unless + * CONFIG_SCHED_ATEXIT_MAX defines a larger number. + * 2. atexit functions are not inherited when a new task is + * created. * * Parameters: - * func + * func - A pointer to the function to be called when the task exits. * * Return Value: * Zero on success. Non-zero on failure. * - ************************************************************************/ + ****************************************************************************/ int atexit(void (*func)(void)) { +#if defined(CONFIG_SCHED_ATEXIT_MAX) && CONFIG_SCHED_ATEXIT_MAX > 1 + _TCB *tcb = (_TCB*)g_readytorun.head; + int index; + int ret = ERROR; + + /* The following must be atomic */ + + if (func) + { + sched_lock(); + + /* Search for the first available slot. atexit() functions are registered + * from lower to higher arry indices; they must be called in the reverse + * order of registration when task exists, i.e., from higher to lower + * indices. + */ + + available = -1; + for (index = 0; index < CONFIG_SCHED_ATEXIT_MAX; index++) + { + if (!tcb->atexitfunc[index]) + { + tcb->atexitfunc[index] = func; + ret = OK; + break; + } + } + + sched_unlock(); + } + + return ret; +#else _TCB *tcb = (_TCB*)g_readytorun.head; int ret = ERROR; @@ -109,6 +154,7 @@ int atexit(void (*func)(void)) sched_unlock(); return ret; +#endif } #endif /* CONFIG_SCHED_ATEXIT */ -- cgit v1.2.3