From patchwork Mon Jul 10 15:00:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Pluzhnikov X-Patchwork-Id: 21520 Received: (qmail 109096 invoked by alias); 10 Jul 2017 15:01:10 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 109078 invoked by uid 89); 10 Jul 2017 15:01:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-vk0-f44.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=8k2l7Vv5ylfH+KbnXJyF1OzbemOpSCofKD7S635y+AM=; b=XE0fIDo8VDnISLpsFC5jcfRSX3n3TLkNHK7RYegxUI3e52uDn7H920JN/arjhHSt4m 2/lvkVgsNMgqHHUpguI0rxuh4rD69b90br3B6QncjspB3PBnQp0Pa9jHf+nul5MgNPgg NuR6616uh/6QmkTDG97oUE/zKrahFr4Upans4urdcsytXrMMRRTnqd61j0O+r05L5QP8 HA1pqgMaHiULwJ2jPMsDflZCrzOFChzlSJwXpEW0EkrLziStCpPBKQ9QFtw0UA5F8fy9 2ql1/obuD4kKkTox12JzAloScE8JxfkAETVHRLOIW35Tjkx29ObSf+L6H5uhiXtZaByU EKKQ== X-Gm-Message-State: AIVw11329/gMneYdBwRWTkEOOXEnqoF8vwlPuKvbGNfGIQhwsvFauH5e QwihXOxkEml6U8YhkGCG8f/f8GM9HE+0bGg= X-Received: by 10.31.169.70 with SMTP id s67mr7982631vke.2.1499698861761; Mon, 10 Jul 2017 08:01:01 -0700 (PDT) MIME-Version: 1.0 From: Paul Pluzhnikov Date: Mon, 10 Jul 2017 08:00:30 -0700 Message-ID: Subject: [patch] Add tests for atexit/on_exit firing order To: GLIBC Devel Greetings, While working a on patch for bz14333, I discovered that there are no tests for ordering of functions registered with atexit/on_exit, and in particular the case where such function itself registers new exit handlers. This patch adds such test. I am using on_exit here because it conveniently allows passing an argument. 2017-07-10 Paul Pluzhnikov * stdlib/Makefile (tests): Add tst-on_exit * stdlib/tst-on_exit.c: New. diff --git a/stdlib/Makefile b/stdlib/Makefile index 0314d5926b..cc9f9215e4 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -80,7 +80,7 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ tst-strtol-locale tst-strtod-nan-locale tst-strfmon_l \ tst-quick_exit tst-thread-quick_exit tst-width \ tst-width-stdint tst-strfrom tst-strfrom-locale \ - tst-getrandom + tst-getrandom tst-on_exit tests-internal := tst-strtod1i tst-strtod3 tst-strtod4 tst-strtod5i \ tst-tls-atexit tst-tls-atexit-nodelete tests-static := tst-secure-getenv diff --git a/stdlib/tst-on_exit.c b/stdlib/tst-on_exit.c new file mode 100644 index 0000000000..0de3b68525 --- /dev/null +++ b/stdlib/tst-on_exit.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include + +#define MAX_ON_EXIT 10 +static int expected[MAX_ON_EXIT]; +static int next_slot = 0; +static int next_expected = 0; + +static void my_on_exit (void (*fn) (int status, void *)); + +static void +fn1 (int status, void *arg) +{ + intptr_t k = (intptr_t) arg; + + printf ("fn1:\t\t%p %d\n", fn1, (int) k); + if (next_slot < 1 || expected[--next_slot] != k) + _exit (1); +} + +static void +fn2 (int status, void *arg) +{ + intptr_t k = (intptr_t) arg; + + printf ("fn2:\t\t%p %d\n", fn2, (int) k); + if (next_slot < 1 || expected[--next_slot] != k) + _exit (1); + my_on_exit (fn1); +} + +static void +fn3 (int status, void *arg) +{ + intptr_t k = (intptr_t) arg; + + printf ("fn3:\t\t%p %d\n", fn3, (int) k); + if (next_slot < 1 || expected[--next_slot] != k) + _exit (1); + my_on_exit (fn2); +} + +static void +my_on_exit (void (*fn) (int, void *)) +{ + intptr_t k = ++next_expected; + + printf ("on_exit:\t%p %d\n", fn, (int) k); + on_exit (fn, (void *) k); + assert (next_slot < MAX_ON_EXIT); + expected[next_slot++] = k; +} + +static int +do_test (void) +{ + my_on_exit (fn2); + my_on_exit (fn1); + my_on_exit (fn2); + my_on_exit (fn3); + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c"