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-09 00:30 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 : #if GPROF 28 : #include <stdio.h> 29 : #include <stdlib.h> 30 : #endif 31 : 32 : #ifdef GCOV 33 : #include <signal.h> /* signal(), SIGABRT, SIG_DFL */ 34 : #include <stdio.h> 35 : #include <stdlib.h> 36 : void __gcov_dump(); 37 12 : static void signals_handler(int sig) 38 : { 39 : (void)sig; 40 12 : signal(SIGABRT,SIG_DFL); 41 12 : signal(SIGSEGV,SIG_DFL); 42 12 : __gcov_dump(); 43 0 : } 44 : #endif /* GCOV */ 45 : 46 32 : static void signals_catch() { 47 : #ifdef GCOV 48 32 : signal(SIGABRT,signals_handler); 49 32 : signal(SIGSEGV,signals_handler); 50 : #endif 51 32 : } 52 : 53 20 : static void signals_release() { 54 : #ifdef GCOV 55 20 : signal(SIGABRT,SIG_DFL); 56 20 : signal(SIGSEGV,SIG_DFL); 57 : #endif 58 20 : } 59 : 60 : static pid_t _forktest_pid; 61 : 62 46 : static void forktest_init() { 63 46 : _forktest_pid = getpid(); 64 46 : } 65 : 66 : #define forktest_only if (_forktest_pid==getpid()) return 67 : 68 32 : static void forktest_gprofdir() { 69 : #ifdef GPROF 70 : if (_forktest_pid!=getpid()) { 71 : /* Forked : mkdir/chdir to a subdir for gmon.out */ 72 : char dirname[20]; 73 : int result = snprintf(dirname, 20, "%d", getpid()); 74 : if ((0<result)&&(20>result)) { 75 : mkdir("gprof", S_IRWXU); 76 : chdir("gprof"); 77 : mkdir(dirname, S_IRWXU); 78 : chdir(dirname); 79 : } else { 80 : fprintf(stderr,"Unable to create GPROF/gmon.out subdir\n"); 81 : abort(); 82 : } 83 : } 84 : #endif /* GPROF */ 85 32 : } 86 : 87 : /* vim:se filetype=c : */