100 #define WATCHDOG_STEPS 3
128 #ifdef USE_WATCHDOG_PIPE
133 static int watchdog_pipe[2];
137 static void watchdog_read(
int unused_event,
void *unused_context)
141 while (read(watchdog_pipe[0], &ch, 1) > 0)
149 static void watchdog_event(
int unused_sig)
151 const char *myname =
"watchdog_event";
160 if ((wp = watchdog_curr) == 0)
165 #ifdef USE_WATCHDOG_PIPE
166 int saved_errno = errno;
169 if (write(watchdog_pipe[1],
"", 1) != 1)
170 msg_warn(
"%s: write watchdog_pipe: %m", myname);
191 const char *myname =
"watchdog_create";
192 struct sigaction sig_action;
197 msg_panic(
"%s: timeout %d is too small", myname, timeout);
199 wp->context = context;
200 wp->saved_watchdog = watchdog_curr;
202 sigemptyset(&sig_action.sa_mask);
204 sig_action.sa_flags = SA_RESTART;
206 sig_action.sa_flags = 0;
208 sig_action.sa_handler = watchdog_event;
209 if (sigaction(SIGALRM, &sig_action, &wp->saved_action) < 0)
210 msg_fatal(
"%s: sigaction(SIGALRM): %m", myname);
212 msg_info(
"%s: %p %d", myname, (
void *) wp, timeout);
213 #ifdef USE_WATCHDOG_PIPE
214 if (watchdog_curr == 0) {
215 if (pipe(watchdog_pipe) < 0)
222 return (watchdog_curr = wp);
229 const char *myname =
"watchdog_destroy";
233 if (sigaction(SIGALRM, &wp->
saved_action, (
struct sigaction *) 0) < 0)
234 msg_fatal(
"%s: sigaction(SIGALRM): %m", myname);
238 #ifdef USE_WATCHDOG_PIPE
239 if (watchdog_curr == 0) {
241 (void) close(watchdog_pipe[0]);
242 (void) close(watchdog_pipe[1]);
246 msg_info(
"%s: %p", myname, (
void *) wp);
253 const char *myname =
"watchdog_start";
255 if (wp != watchdog_curr)
256 msg_panic(
"%s: wrong watchdog instance", myname);
260 msg_info(
"%s: %p", myname, (
void *) wp);
267 const char *myname =
"watchdog_stop";
269 if (wp != watchdog_curr)
270 msg_panic(
"%s: wrong watchdog instance", myname);
273 msg_info(
"%s: %p", myname, (
void *) wp);
280 const char *myname =
"watchdog_pat";
285 msg_info(
"%s: %p", myname, (
void *) watchdog_curr);
292 int main(
int unused_argc,
char **unused_argv)
void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
WATCHDOG * saved_watchdog
NORETURN msg_panic(const char *fmt,...)
void watchdog_destroy(WATCHDOG *wp)
int main(int argc, char **argv)
void watchdog_start(WATCHDOG *wp)
void(* WATCHDOG_FN)(WATCHDOG *, char *)
void killme_after(unsigned int seconds)
#define VSTREAM_GETCHAR()
WATCHDOG * watchdog_create(unsigned timeout, WATCHDOG_FN action, char *context)
void msg_warn(const char *fmt,...)
NORETURN msg_fatal(const char *fmt,...)
void watchdog_stop(WATCHDOG *wp)
int non_blocking(int, int)
struct sigaction saved_action
void event_disable_readwrite(int fd)
void * mymalloc(ssize_t len)
void msg_info(const char *fmt,...)