diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-11-01 16:50:53 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-11-01 16:50:53 +0000 |
commit | eb26187767da1e752bfdc6571ccb70e3f84fd954 (patch) | |
tree | 6047f392552b62c0d5f6e7aabe95266b5f2ef0cf /nuttx/libxx | |
parent | 1214744afca8851c7888b6b3f2bb8b47c5a815e2 (diff) | |
download | px4-firmware-eb26187767da1e752bfdc6571ccb70e3f84fd954.tar.gz px4-firmware-eb26187767da1e752bfdc6571ccb70e3f84fd954.tar.bz2 px4-firmware-eb26187767da1e752bfdc6571ccb70e3f84fd954.zip |
Add __cxa_atexit(); atexit() is now built on top of on_exit()
git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5292 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/libxx')
-rw-r--r-- | nuttx/libxx/Makefile | 6 | ||||
-rw-r--r-- | nuttx/libxx/libxx_cxa_atexit.cxx | 143 | ||||
-rw-r--r-- | nuttx/libxx/libxx_eabi_atexit.cxx | 23 | ||||
-rw-r--r-- | nuttx/libxx/libxx_internal.hxx | 67 |
4 files changed, 223 insertions, 16 deletions
diff --git a/nuttx/libxx/Makefile b/nuttx/libxx/Makefile index 922c8d825..bc8c5012e 100644 --- a/nuttx/libxx/Makefile +++ b/nuttx/libxx/Makefile @@ -39,8 +39,10 @@ ASRCS = CSRCS = -CXXSRCS = libxx_cxapurevirtual.cxx libxx_delete.cxx libxx_deletea.cxx -CXXSRCS += libxx_eabi_atexit.cxx libxx_new.cxx libxx_newa.cxx + +CXXSRCS = libxx_cxapurevirtual.cxx libxx_delete.cxx libxx_deletea.cxx +CXXSRCS += libxx_eabi_atexit.cxx libxx_cxa_atexit.cxx libxx_new.cxx +CXXSRCS += libxx_newa.cxx # Paths diff --git a/nuttx/libxx/libxx_cxa_atexit.cxx b/nuttx/libxx/libxx_cxa_atexit.cxx new file mode 100644 index 000000000..7e6d00a37 --- /dev/null +++ b/nuttx/libxx/libxx_cxa_atexit.cxx @@ -0,0 +1,143 @@ +//*************************************************************************** +// libxx/libxx_eabi_atexit.cxx +// +// 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 +// 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 <cstdlib> +#include <cassert> + +#include "libxx_internal.hxx" + +//*************************************************************************** +// Pre-processor Definitions +//*************************************************************************** + +//*************************************************************************** +// Private Types +//*************************************************************************** + +struct __cxa_atexit_s +{ + __cxa_exitfunc_t func; + FAR void *arg; +}; + +//*************************************************************************** +// Private Data +//*************************************************************************** + +extern "C" +{ + //************************************************************************* + // Public Data + //************************************************************************* + + FAR void *__dso_handle = NULL; + + //************************************************************************* + // Private Functions + //************************************************************************* + + //************************************************************************* + // Name: __cxa_callback + // + // Description: + // This is really just an "adaptor" function that matches the form of + // the __cxa_exitfunc_t to an onexitfunc_t using an allocated structure + // to marshall the call parameters. + // + //************************************************************************* + +#if CONFIG_SCHED_ONEXIT + static void __cxa_callback(int exitcode, FAR void *arg) + { + FAR struct __cxa_atexit_s *alloc = (FAR struct __cxa_atexit_s *)arg; + DEBUGASSERT(alloc && alloc->func); + + alloc->func(alloc->arg); + free(alloc); + } +#endif + + //************************************************************************* + // Public Functions + //************************************************************************* + + //************************************************************************* + // Name: __cxa_atexit + // + // Description: + // __cxa_atexit() registers a destructor function to be called by exit(). + // On a call to exit(), the registered functions should be called with + // the single argument 'arg'. Destructor functions shall always be + // called in the reverse order to their registration (i.e. the most + // recently registered function shall be called first), + // + // If shared libraries were supported, the callbacks should be invoked + // when the shared library is unloaded as well. + // + // Reference: + // Linux base + // + //************************************************************************* + + int __cxa_atexit(__cxa_exitfunc_t func, FAR void *arg, FAR void *dso_handle) + { +#if CONFIG_SCHED_ONEXIT + // Allocate memory to hold the marshaled __cxa_exitfunc_t call + // information. + + FAR struct __cxa_atexit_s *alloc = + (FAR struct __cxa_atexit_s *)malloc(sizeof(struct __cxa_atexit_s)); + + if (alloc) + { + // Register the function to be called when the task/thread exists. + + return on_exit(__cxa_callback, alloc); + } + else +#endif + { + // What else can we do? + + return 0; + } + } +} diff --git a/nuttx/libxx/libxx_eabi_atexit.cxx b/nuttx/libxx/libxx_eabi_atexit.cxx index aa0ff6956..25f8306a8 100644 --- a/nuttx/libxx/libxx_eabi_atexit.cxx +++ b/nuttx/libxx/libxx_eabi_atexit.cxx @@ -40,27 +40,23 @@ #include <nuttx/config.h> #include <cstdlib> +#include "libxx_internal.hxx" + //*************************************************************************** -// Definitions +// Pre-processor Definitions //*************************************************************************** //*************************************************************************** // Private Data //*************************************************************************** +//*************************************************************************** +// Public Functions +//*************************************************************************** + extern "C" { //************************************************************************* - // Public Data - //************************************************************************* - - void *__dso_handle = NULL; - - //************************************************************************* - // Public Functions - //************************************************************************* - - //************************************************************************* // Name: __aeabi_atexit // // Description: @@ -75,9 +71,8 @@ extern "C" // //************************************************************************* - int __aeabi_atexit(void* object, void (*destroyer)(void*), void *dso_handle) + int __aeabi_atexit(FAR void *object, __cxa_exitfunc_t func, FAR void *dso_handle) { - //return __cxa_atexit(destroyer, object, dso_handle); // 0 ? OK; non-0 ? failed } - return 0; + return __cxa_atexit(func, object, dso_handle); // 0 ? OK; non-0 ? failed } } diff --git a/nuttx/libxx/libxx_internal.hxx b/nuttx/libxx/libxx_internal.hxx new file mode 100644 index 000000000..fe84c763e --- /dev/null +++ b/nuttx/libxx/libxx_internal.hxx @@ -0,0 +1,67 @@ +//*************************************************************************** +// lib/libxx_internal.h +// +// 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 +// 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. +// +//*************************************************************************** + +#ifndef __LIBXX_LIBXX_INTERNAL_HXX +#define __LIBXX_LIBXX_INTERNAL_HXX + +//*************************************************************************** +// Included Files +//*************************************************************************** + +#include <nuttx/config.h> + +//*************************************************************************** +// Definitions +//*************************************************************************** + +//*************************************************************************** +// Public Types +//***************************************************************************/ + +typedef CODE void (*__cxa_exitfunc_t)(void *arg); + +//*************************************************************************** +// Public Variables +//*************************************************************************** + +extern "C" FAR void *__dso_handle; + +//*************************************************************************** +// Public Function Prototypes +//*************************************************************************** + +extern "C" int __cxa_atexit(__cxa_exitfunc_t func, void *arg, void *dso_handle); + +#endif // __LIBXX_LIBXX_INTERNAL_HXX |