X-Git-Url: https://git.saurik.com/apple/libpthread.git/blobdiff_plain/3404ec80a22ac38c97e573f77f7cbdf4bddc8ca9..964d3577b041867f776d8eb940bf4a1108ffb97c:/tests/atfork.c diff --git a/tests/atfork.c b/tests/atfork.c new file mode 100644 index 0000000..7b760c0 --- /dev/null +++ b/tests/atfork.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include + +#define DECL_ATFORK(x) \ +static void prepare_##x(void) { \ + printf("%d: %s\n", getpid(), __FUNCTION__); \ +} \ +static void parent_##x(void) { \ + printf("%d: %s\n", getpid(), __FUNCTION__); \ +} \ +static void child_##x(void) { \ + printf("%d: %s\n", getpid(), __FUNCTION__); \ +} + +#define ATFORK(x) \ +os_assumes_zero(pthread_atfork(prepare_##x, parent_##x, child_##x)); + +DECL_ATFORK(1); +DECL_ATFORK(2); +DECL_ATFORK(3); +DECL_ATFORK(4); +DECL_ATFORK(5); +DECL_ATFORK(6); +DECL_ATFORK(7); +DECL_ATFORK(8); +DECL_ATFORK(9); +DECL_ATFORK(10); +DECL_ATFORK(11); +DECL_ATFORK(12); +DECL_ATFORK(13); +DECL_ATFORK(14); +DECL_ATFORK(15); +DECL_ATFORK(16); +DECL_ATFORK(17); +DECL_ATFORK(18); +DECL_ATFORK(19); + +int main(int argc, char *argv[]) { + ATFORK(1); + ATFORK(2); + ATFORK(3); + ATFORK(4); + ATFORK(5); + ATFORK(6); + ATFORK(7); + ATFORK(8); + ATFORK(9); + ATFORK(10); + ATFORK(11); + ATFORK(12); + ATFORK(13); + ATFORK(14); + ATFORK(15); + ATFORK(16); + ATFORK(17); + ATFORK(18); + ATFORK(19); + + pid_t pid = fork(); + if (pid == 0) { + pid = fork(); + } + if (pid == -1) { + posix_assumes_zero(pid); + } else if (pid > 0) { + int status; + posix_assumes_zero(waitpid(pid, &status, 0)); + posix_assumes_zero(WEXITSTATUS(status)); + } + return 0; +}