summaryrefslogtreecommitdiff
path: root/nuttx/sched/atexit.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-08-01 17:47:54 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-08-01 17:47:54 +0000
commit2dfc5da16f3e3abc4b36413e8205e3dcd4df7928 (patch)
tree9226c125b2583f72f45393934b2571f2600fee49 /nuttx/sched/atexit.c
parent4a16b1826cafc353fa90826cbd4416476f1ea682 (diff)
downloadpx4-nuttx-2dfc5da16f3e3abc4b36413e8205e3dcd4df7928.tar.gz
px4-nuttx-2dfc5da16f3e3abc4b36413e8205e3dcd4df7928.tar.bz2
px4-nuttx-2dfc5da16f3e3abc4b36413e8205e3dcd4df7928.zip
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
Diffstat (limited to 'nuttx/sched/atexit.c')
-rw-r--r--nuttx/sched/atexit.c88
1 files changed, 67 insertions, 21 deletions
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 <nuttx/config.h>
@@ -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 */