Files CCore/inc/libc/atexit.h CCore/src/libc/atexit.cpp
atexit() is a C standard function. It registers a pointer to a function to be executed after the function main(). In C++ it may also be used to register global object destructors. gcc uses the extended variant of this function __cxa_atexit.
(from stdlib.h) /* termination */ typedef void (*__std_atexit_t)(void); extern int atexit(__std_atexit_t func); typedef void (*__cxa_atexit_t)(void *arg); extern int __cxa_atexit(__cxa_atexit_t func,void *arg,void *dso);
This part provides implementation of these functions and the function Exit_atexit() to call all registered functions.
#ifndef CCore_inc_libc_atexit_h
#define CCore_inc_libc_atexit_h
namespace CCore {
/* init/exit functions */
void Exit_atexit();
} // namespace CCore
#endif
You can reuse the implementation from the Vanilla-X or create your own.
namespace CCore {
/* init/exit functions */
namespace Private_atexit {
/* struct Func */
struct Func
{
struct Ext
{
__cxa_atexit_t func;
void *arg;
void *dso;
};
__std_atexit_t func;
Ext ext;
static Func Create(__std_atexit_t func);
static Func Create(__cxa_atexit_t func,void *arg,void *dso);
void operator () ()
{
if( func )
{
func();
}
else
{
ext.func(ext.arg);
}
}
};
....
bool FuncBlock::Push(const Func &func);
bool FuncBlock::Pop(Func &ret);
} // namespace Private_atexit
using namespace Private_atexit;
/* init/exit functions */
void Exit_atexit()
{
for(Func func; FuncBlock::Pop(func) ;) func();
}
} // namespace CCore
using namespace CCore;
/* atexit() */
int atexit(__std_atexit_t func)
{
if( !func )
{
errno=EBADARG;
return -1;
}
Dev::IntLock lock;
return FuncBlock::Push(Func::Create(func))?0:1 ;
}
int __cxa_atexit(__cxa_atexit_t func,void *arg,void *dso)
{
if( !func )
{
errno=EBADARG;
return -1;
}
Dev::IntLock lock;
return FuncBlock::Push(Func::Create(func,arg,dso))?0:1 ;
}
Remember, that registration must be done under the IntLock protection.