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