µOS++ IIIe Reference 7.0.0
The third edition of µOS++, a POSIX inspired open source framework, written in C++
Loading...
Searching...
No Matches
atexit.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the µOS++ distribution.
3 * (https://github.com/micro-os-plus)
4 * Copyright (c) 2015 Liviu Ionescu.
5 *
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation
8 * files (the "Software"), to deal in the Software without
9 * restriction, including without limitation the rights to use,
10 * copy, modify, merge, publish, distribute, sublicense, and/or
11 * sell copies of the Software, and to permit persons to whom
12 * the Software is furnished to do so, subject to the following
13 * conditions:
14 *
15 * The above copyright notice and this permission notice shall be
16 * included in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 * OTHER DEALINGS IN THE SOFTWARE.
26 */
27
28#if defined(__clang__)
29#pragma clang diagnostic ignored "-Wempty-translation-unit"
30#endif
31
32// ----------------------------------------------------------------------------
33
34#if defined(__ARM_EABI__)
35
36// ----------------------------------------------------------------------------
37
38#include <cmsis-plus/rtos/os.h>
40
41#include <stdlib.h>
42#include <assert.h>
43
44#include "atexit.h"
45
46// ----------------------------------------------------------------------------
47
48#if defined(OS_INCLUDE_ATEXIT_STATIC) && !defined(__EXCEPTIONS)
49
78int
79atexit (exit_func_t fn)
80{
81#if defined(OS_TRACE_LIBC_ATEXIT)
82 trace_printf ("%s(%p)\n", __func__, fn);
83#endif
84
85 return __register_exitproc (__et_atexit, fn, NULL, NULL);
86}
87
88// ----------------------------------------------------------------------------
89
90#if !defined(OS_INTEGER_ATEXIT_ARRAY_SIZE)
91// Due to an odd behaviour, destructors for main and idle are
92// called via atexit().
93#define OS_INTEGER_ATEXIT_ARRAY_SIZE (3)
94#endif
95
99size_t __atexit_count;
100
108exit_func_t __atexit_functions[OS_INTEGER_ATEXIT_ARRAY_SIZE];
109
123int
124__register_exitproc (int type, exit_func_t fn,
125 void *arg __attribute__((unused)),
126 void *d __attribute__((unused)))
127{
128 assert(type == __et_atexit);
129 assert(__atexit_count < OS_INTEGER_ATEXIT_ARRAY_SIZE);
130
131#if defined(NDEBUG)
132 if ((type != __et_atexit) || (__atexit_count >= OS_INTEGER_ATEXIT_ARRAY_SIZE))
133 {
134 return -1;
135 }
136#endif
137
138 // Use scheduler lock to synchronise access to the array.
140
141 __atexit_functions[__atexit_count++] = fn;
142 return 0;
143}
144
145// ----------------------------------------------------------------------------
146
147void
148__call_exitprocs (int code __attribute__((unused)),
149 void* d __attribute__((unused)))
150{
151 trace_printf("%s()\n", __func__);
152
153 // Call registered functions in reverse order.
154 for (size_t i = __atexit_count; i > 0;)
155 {
156 __atexit_functions[--i] ();
157 }
158}
159
160#endif /* !defined(__EXCEPTIONS) */
161
162// ----------------------------------------------------------------------------
163
164#endif /* defined(__ARM_EABI__) */
void(* exit_func_t)(void)
Definition atexit.h:56
void __call_exitprocs(int, void *)
@ __et_atexit
Definition atexit.h:47
int __register_exitproc(int, exit_func_t fn, void *, void *)
Scheduler critical section RAII helper.
Definition os-sched.h:182
#define OS_INTEGER_ATEXIT_ARRAY_SIZE
Define the size of the atexit() array.
Single file µOS++ RTOS definitions.
int trace_printf(const char *format,...)