diff options
Diffstat (limited to 'nuttx/lib')
-rw-r--r-- | nuttx/lib/stdlib/Make.defs | 4 | ||||
-rw-r--r-- | nuttx/lib/stdlib/lib_abort.c | 56 |
2 files changed, 50 insertions, 10 deletions
diff --git a/nuttx/lib/stdlib/Make.defs b/nuttx/lib/stdlib/Make.defs index 14ffd787a..3119ecda4 100644 --- a/nuttx/lib/stdlib/Make.defs +++ b/nuttx/lib/stdlib/Make.defs @@ -1,8 +1,8 @@ ############################################################################ # lib/stdlib/Make.defs # -# Copyright (C) 2011 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt <spudmonkey@racsa.co.cr> +# Copyright (C) 2012 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 diff --git a/nuttx/lib/stdlib/lib_abort.c b/nuttx/lib/stdlib/lib_abort.c index 6a47e6ea4..84b600950 100644 --- a/nuttx/lib/stdlib/lib_abort.c +++ b/nuttx/lib/stdlib/lib_abort.c @@ -1,8 +1,8 @@ /************************************************************************ - * lib/stdlib/abort.c + * lib/stdlib/lib_abort.c * - * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt <spudmonkey@racsa.co.cr> + * Copyright (C) 2007, 2009, 2011-2012 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 @@ -37,10 +37,13 @@ * Included Files ************************************************************************/ +#include <nuttx/config.h> + #include <stdlib.h> +#include <pthread.h> /************************************************************************ - * Definitions + * Pre-processor Definitions ************************************************************************/ /************************************************************************ @@ -60,7 +63,7 @@ ************************************************************************/ /************************************************************************ - * Private Functionss + * Private Functions ************************************************************************/ /************************************************************************ @@ -68,14 +71,51 @@ ************************************************************************/ /************************************************************************ - * Function: abort + * Name: Abort * * Description: - * The abort() function causes abnormal program termination. - * All open streams are closed and flushed. + * The abort() first unblocks the SIGABRT signal, and then raises that + * signal for the calling process. This results in the abnormal + * termination of the process unless the SIGABRT signal is caught and + * the signal handler does not return. + * + * If the abort() function causes process termination, all open + * streams are closed and flushed. + * + * If the SIGABRT signal is ignored, or caught by a handler that + * returns, the abort() function will still terminate the process. + * It does this by restoring the default disposition for SIGABRT and + * then raising the signal for a second time. + * + * Input parameters: + * None + * + * Returned Value: + * This function does not return, + * ************************************************************************/ void abort(void) { + /* NuttX does not support standard signal functionality (like the + * behavior of the SIGABRT signal). So no attempt is made to provide + * a conformant version of abort() at this time. This version does not + * signal the calling thread all. + * + * Note that pthread_exit() is called instead of exit(). That is because + * we do no know if abort was called from a pthread or a normal thread + * (we could find out, of course). If abort() is called from a non-pthread, + * then pthread_exit() should fail and fall back to call exit() anyway. + * + * If exit() is called (either below or via pthread_exit()), then exit() + * will flush and close all open files and terminate the thread. If this + * function was called from a pthread, then pthread_exit() will complete + * any joins, but will not flush or close any streams. + */ + +#ifdef CONFIG_DISABLE_PTHREAD exit(EXIT_FAILURE); +#else + pthread_exit(NULL); +#endif } |