[PATCH] libcsupport: POSIX conformance for _exit()

Sebastian Huber sebastian.huber at embedded-brains.de
Tue Apr 23 13:10:13 UTC 2013


According to POSIX the _exit() function shall not call functions
registered with atexit() nor any registered signal handlers.

See also tests libtests/exit01 and libtests/exit02.

Make libc_wrapup() static.  Remove out of date comments.  Remove
superfluous declarations, defines and includes.
---
 cpukit/libcsupport/src/newlibc_exit.c |   89 +-------------------------------
 1 files changed, 3 insertions(+), 86 deletions(-)

diff --git a/cpukit/libcsupport/src/newlibc_exit.c b/cpukit/libcsupport/src/newlibc_exit.c
index 8e47b17..8dbbfce 100644
--- a/cpukit/libcsupport/src/newlibc_exit.c
+++ b/cpukit/libcsupport/src/newlibc_exit.c
@@ -1,8 +1,4 @@
 /*
- *  Implementation of hooks for the CYGNUS newlib libc
- *  These hooks set things up so that:
- *       + '_REENT' is switched at task switch time.
- *
  *  COPYRIGHT (c) 1994 by Division Incorporated
  *
  *  The license and distribution terms for this file may be
@@ -21,35 +17,10 @@
 #if defined(RTEMS_NEWLIB)
 #include <rtems/libcsupport.h>
 
-/* Since we compile with strict ANSI we need to undef it to get
- * prototypes for extensions
- */
-#undef __STRICT_ANSI__
-
-#include <stdlib.h>             /* for free() */
-#include <string.h>             /* for memset() */
-
-#include <sys/reent.h>          /* for extern of _REENT (aka _impure_ptr) */
-#include <errno.h>
-
 #include <stdio.h>
+#include <unistd.h>
 
-int _fwalk(struct _reent *ptr, int (*function) (FILE *) );
-
-/* do we think we are reentrant? */
-extern int             libc_reentrant;
-extern struct _reent * const _global_impure_ptr __ATTRIBUTE_IMPURE_PTR__;
-
-/*
- * CYGNUS newlib routine that does atexit() processing and flushes
- *      stdio streams
- *      undocumented
- */
-
-extern void _wrapup_reent(struct _reent *);
-extern void _reclaim_reent(struct _reent *);
-
-void libc_wrapup(void)
+static void libc_wrapup(void)
 {
   /*
    *  In case RTEMS is already down, don't do this.  It could be
@@ -60,22 +31,6 @@ void libc_wrapup(void)
      return;
 
   /*
-   *  This was already done if the user called exit() directly .
-  _wrapup_reent(0);
-   */
-
-  if (_REENT != _global_impure_ptr) {
-      _wrapup_reent(_global_impure_ptr);
-#if 0
-      /*  Don't reclaim this one, just in case we do printfs
-       *  on the way out to ROM.
-       */
-      _reclaim_reent(&libc_global_reent);
-#endif
-      _REENT = _global_impure_ptr;
-  }
-
-  /*
    * Try to drain output buffers.
    *
    * Should this be changed to do *all* file streams?
@@ -87,38 +42,7 @@ void libc_wrapup(void)
   fclose (stderr);
 }
 
-/*
- *  Function:   _exit
- *  Created:    94/12/10
- *
- *  Description:
- *      Called from exit() after it does atexit() processing and stdio fflush's
- *
- *      called from bottom of exit() to really delete the task.
- *      If we are using reentrant libc, then let the delete extension
- *      do all the work, otherwise if a shutdown is in progress,
- *      then just do it.
- *
- *  Parameters:
- *      exit status
- *
- *  Returns:
- *      does not return
- *
- *  Side Effects:
- *
- *  Notes:
- *
- *
- *  Deficiencies/ToDo:
- *
- *
- */
-
-#include <unistd.h>
-
 /* FIXME: These defines are a blatant hack */
-  #define EXIT_SYMBOL _exit
 
   #if defined(__USE_INIT_FINI__)
     #if defined(__m32r__)
@@ -132,7 +56,7 @@ void libc_wrapup(void)
     extern void FINI_SYMBOL( void );
   #endif
 
-void EXIT_SYMBOL(int status)
+void _exit(int status)
 {
   /*
    *  If the toolset uses init/fini sections, then we need to
@@ -142,16 +66,9 @@ void EXIT_SYMBOL(int status)
     FINI_SYMBOL();
   #endif
 
-  /*
-   *  We need to do the exit processing on the global reentrancy structure.
-   *  This has already been done on the per task reentrancy structure
-   *  associated with this task.
-   */
-
   libc_wrapup();
   rtems_shutdown_executive(status);
   for (;;) ; /* to avoid warnings */
 }
 
-
 #endif
-- 
1.7.7




More information about the devel mailing list