summaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
authorPaul Pluzhnikov <ppluzhnikov@google.com>2017-09-01 09:31:13 -0700
committerPaul Pluzhnikov <ppluzhnikov@google.com>2017-09-01 09:31:13 -0700
commit50c66c7acd90f257b295e58bf938ed120cbc27c7 (patch)
tree2fd513363e3e9c7dad48716568769eb626bfec45 /stdlib
parenta617bd119f1b36a7ff2d2fdecf0d2f56970d0288 (diff)
2017-09-01 Paul Pluzhnikov <ppluzhnikov@google.com>
* stdlib/tst-atexit-common.c (do_test): Test support for at least 32 atexit handlers.
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/tst-atexit-common.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/stdlib/tst-atexit-common.c b/stdlib/tst-atexit-common.c
index 99b00bf3aa..d6dcf08cdd 100644
--- a/stdlib/tst-atexit-common.c
+++ b/stdlib/tst-atexit-common.c
@@ -23,7 +23,13 @@
#include <unistd.h>
#include <sys/wait.h>
-#define MAX_ATEXIT 20 /* Large enough for current set of invocations. */
+/* http://pubs.opengroup.org/onlinepubs/000095399/functions/atexit.html
+ requires that we support at least 32 atexit handlers.
+
+ The number we actually support is limited by memory. Here we simply
+ check that we support at least the minimum required. */
+#define MAX_ATEXIT 32
+
static char crumbs[MAX_ATEXIT];
static int next_slot = 0;
@@ -66,7 +72,7 @@ static void
fn_final (void)
{
/* Arbitrary sequence matching current registrations. */
- const char expected[] = "3021121130211";
+ const char expected[] = "00000000000000000000000003021121130211";
if (strcmp (crumbs, expected) == 0)
_exit_with_flush (0);
@@ -76,25 +82,26 @@ fn_final (void)
_exit_with_flush (1);
}
-/* This is currently just a basic test to verify that exit handlers execute
- in LIFO order, even when the handlers register additional new handlers.
-
- TODO: Additional tests that we should do:
- 1. POSIX says we need to support at least ATEXIT_MAX
- 2. ... */
-
static int
do_test (void)
{
+ int slots_remaining = MAX_ATEXIT;
+
/* Register this first so it can verify expected order of the rest. */
- ATEXIT (fn_final);
+ ATEXIT (fn_final); --slots_remaining;
- ATEXIT (fn1);
- ATEXIT (fn3);
- ATEXIT (fn1);
- ATEXIT (fn2);
- ATEXIT (fn1);
- ATEXIT (fn3);
+ ATEXIT (fn1); --slots_remaining;
+ ATEXIT (fn3); --slots_remaining;
+ ATEXIT (fn1); --slots_remaining;
+ ATEXIT (fn2); --slots_remaining;
+ ATEXIT (fn1); --slots_remaining;
+ ATEXIT (fn3); --slots_remaining;
+
+ /* Fill the rest of available slots with fn0. */
+ while (slots_remaining > 0)
+ {
+ ATEXIT (fn0); --slots_remaining;
+ }
/* Verify that handlers registered above are inherited across fork. */
const pid_t child = fork ();