31 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Static instance of _on_exit_args struct.
 | |
|  *
 | |
|  * When _REENT_SMALL is used, _atexit struct only contains a pointer to
 | |
|  * _on_exit_args struct, so this was always allocated with malloc() - even for
 | |
|  * the first 32 calls of atexit()-like functions, which are guaranteed to
 | |
|  * succeed, but could fail because of "out of memory" error. This is even worse
 | |
|  * when _ATEXIT_DYNAMIC_ALLOC is _NOT_ defined, in which case malloc() is not
 | |
|  * used by internals of atexit()-like functions. In such configuration all calls
 | |
|  * to the functions that need _on_exit_args struct (on_exit() and
 | |
|  * __cxa_atexit()) would fail.
 | |
|  *
 | |
|  * Thats why a static instance of _on_exit_args struct is provided for
 | |
|  * _REENT_SMALL configuration. This way the first 32 calls to atexit()-like
 | |
|  * functions don't need malloc() and will always succeed.
 | |
|  *
 | |
|  * Because this struct is not needed for "normal" atexit(), it is used as a weak
 | |
|  * reference in __register_exitproc(), but any use of on_exit() or
 | |
|  * __cxa_atexit() will force it to be linked.
 | |
|  */
 | |
| 
 | |
| #include <reent.h>
 | |
| 
 | |
| #ifdef _REENT_SMALL
 | |
| 
 | |
| static struct _on_exit_args _on_exit_args_instance = {{_NULL}, {_NULL}, 0, 0};
 | |
| 
 | |
| struct _on_exit_args * const __on_exit_args = &_on_exit_args_instance;
 | |
| 
 | |
| #endif	/* def _REENT_SMALL */
 |