1 /* 2 * Copyright (C) 1996-2021 The Squid Software Foundation and contributors 3 * 4 * Squid software is distributed under GPLv2+ license and includes 5 * contributions from numerous individuals and organizations. 6 * Please see the COPYING and CONTRIBUTORS files for details. 7 */ 8 9 #ifndef SQUID_IPC_KID_H 10 #define SQUID_IPC_KID_H 11 12 #include "SquidString.h" 13 #include "tools.h" 14 15 /// Squid child, including current forked process info and 16 /// info persistent across restarts 17 class Kid 18 { 19 public: 20 21 /// keep restarting until the number of bad failures exceed this limit 22 enum { badFailureLimit = 4 }; 23 24 /// slower start failures are not "frequent enough" to be counted as "bad" 25 enum { fastFailureTimeLimit = 10 }; // seconds 26 27 public: 28 Kid(); 29 30 Kid(const char *role, const int id); 31 32 /// called when this kid got started, records PID 33 void start(pid_t cpid); 34 35 /// called when kid terminates, sets exiting status 36 void stop(PidStatus const exitStatus); 37 38 /// returns true if tracking of kid is stopped 39 bool running() const; 40 41 /// returns true if master should restart this kid 42 bool shouldRestart() const; 43 44 /// returns current pid for a running kid and last pid for a stopped kid 45 pid_t getPid() const; 46 47 /// whether the failures are "repeated and frequent" 48 bool hopeless() const; 49 50 /// forgets all past failures, ensuring that we are not hopeless() forgetFailures()51 void forgetFailures() { badFailures = 0; } 52 53 /// \returns the time since process termination 54 time_t deathDuration() const; 55 56 /// returns true if the process terminated normally 57 bool calledExit() const; 58 59 /// returns the exit status of the process 60 int exitStatus() const; 61 62 /// whether the process exited with a given exit status code 63 bool calledExit(int code) const; 64 65 /// whether the process exited with code 0 66 bool exitedHappy() const; 67 68 /// returns true if the kid was terminated by a signal 69 bool signaled() const; 70 71 /// returns the number of the signal that caused the kid to terminate 72 int termSignal() const; 73 74 /// whether the process was terminated by a given signal 75 bool signaled(int sgnl) const; 76 77 /// \returns kid's role and ID formatted for use as a process name 78 SBuf processName() const; 79 80 /// \returns kid's role and ID summary; usable as a --kid parameter value 81 SBuf gist() const; 82 83 private: 84 void reportStopped() const; 85 86 // Information preserved across restarts 87 SBuf processRole; 88 int processId = 0; 89 int badFailures = 0; ///< number of "repeated frequent" failures 90 91 // Information specific to a running or stopped kid 92 pid_t pid = -1; ///< current (for a running kid) or last (for stopped kid) PID 93 time_t startTime = 0; ///< last start time 94 time_t stopTime = 0; ///< last termination time 95 bool isRunning = false; ///< whether the kid is assumed to be alive 96 PidStatus status = 0; ///< exit status of a stopped kid 97 }; 98 99 // TODO: processes may not be kids; is there a better place to put this? 100 101 /// process kinds 102 typedef enum { 103 pkOther = 0, ///< we do not know or do not care 104 pkCoordinator = 1, ///< manages all other kids 105 pkWorker = 2, ///< general-purpose worker bee 106 pkDisker = 4, ///< cache_dir manager 107 pkHelper = 8 ///< general-purpose helper child 108 } ProcessKind; 109 110 /// ProcessKind for the current process 111 extern int TheProcessKind; 112 113 #endif /* SQUID_IPC_KID_H */ 114 115