Line data Source code
1 : /** 2 : * @file checktools.inc 3 : * @brief 4 : * 5 : * @author François Cerbelle (Fanfan), francois@cerbelle.net 6 : * 7 : * @internal 8 : * Created: 19/07/2024 9 : * Revision: none 10 : * Last modified: 2024-11-20 22:48 11 : * Compiler: gcc 12 : * Organization: Cerbelle.net 13 : * Copyright: Copyright (c) 2024, François Cerbelle 14 : * 15 : * This source code is released for free distribution under the terms of the 16 : * GNU General Public License as published by the Free Software Foundation. 17 : */ 18 : 19 : 20 : #ifdef HAVE_CONFIG_H 21 : #include "config.h" 22 : #endif 23 : 24 : #include <unistd.h> /* pid_t getpid() */ 25 : #include <sys/stat.h> /* mkdir(), chdir(), mode_t */ 26 : 27 : #ifdef NDEBUG 28 : /* Operating system / libc catched */ 29 : #define SIG_ABRTSEGV 11 30 : #else 31 : /* Assertion catched */ 32 : #define SIG_ABRTSEGV 6 33 : #endif 34 : 35 : #if GPROF 36 : #include <stdio.h> 37 : #include <stdlib.h> 38 : #endif 39 : 40 : #ifdef GCOV 41 : #include <signal.h> /* signal(), SIGABRT, SIG_DFL */ 42 : #include <stdio.h> 43 : #include <stdlib.h> 44 : void __gcov_dump(); 45 80 : static void signals_handler(int sig) 46 : { 47 : (void)sig; 48 80 : signal(SIGABRT,SIG_DFL); 49 80 : signal(SIGSEGV,SIG_DFL); 50 80 : __gcov_dump(); 51 0 : } 52 : #endif /* GCOV */ 53 : 54 363 : static void signals_catch() { 55 : #ifdef GCOV 56 363 : signal(SIGABRT,signals_handler); 57 363 : signal(SIGSEGV,signals_handler); 58 : #endif 59 363 : } 60 : 61 283 : static void signals_release() { 62 : #ifdef GCOV 63 283 : signal(SIGABRT,SIG_DFL); 64 283 : signal(SIGSEGV,SIG_DFL); 65 : #endif 66 283 : } 67 : 68 : static pid_t _forktest_pid; 69 : 70 307 : static void forktest_init() { 71 307 : _forktest_pid = getpid(); 72 307 : } 73 : 74 : #define forktest_only if (_forktest_pid==getpid()) return 75 : 76 363 : static void forktest_gprofdir() { 77 : #ifdef GPROF 78 : if (_forktest_pid!=getpid()) { 79 : /* Forked : mkdir/chdir to a subdir for gmon.out */ 80 : char dirname[20]; 81 : int result = snprintf(dirname, 20, "%d", getpid()); 82 : if ((0<result)&&(20>result)) { 83 : mkdir("gprof", S_IRWXU); 84 : chdir("gprof"); 85 : mkdir(dirname, S_IRWXU); 86 : chdir(dirname); 87 : } else { 88 : fprintf(stderr,"Unable to create GPROF/gmon.out subdir\n"); 89 : abort(); 90 : } 91 : } 92 : #endif /* GPROF */ 93 363 : } 94 : 95 : /* vim:se filetype=c : */