1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
5 
6 #include "hydra_timeout.h"
7 #include "hydra_err.h"
8 
get_current_time(void)9 static time_t get_current_time(void)
10 {
11     return time(NULL);
12 }
13 
HYD_init_timeout(int sec,struct timeout_s * timeout)14 void HYD_init_timeout(int sec, struct timeout_s *timeout)
15 {
16     timeout->sec = sec;
17 
18     if (timeout->sec >= 0) {
19         timeout->start_time = get_current_time();
20     }
21 }
22 
HYD_set_alarm(struct timeout_s * timeout)23 void HYD_set_alarm(struct timeout_s *timeout)
24 {
25 #ifdef HAVE_ALARM
26     alarm(timeout->sec);
27 #endif /* HAVE_ALARM */
28     timeout->start_time = get_current_time();
29 }
30 
HYD_handle_sigalrm(struct timeout_s * timeout)31 void HYD_handle_sigalrm(struct timeout_s *timeout)
32 {
33     timeout->timed_out = 1;
34 }
35 
HYD_get_timeout_signal(struct timeout_s * timeout)36 int HYD_get_timeout_signal(struct timeout_s *timeout)
37 {
38     return (timeout->signal > 0) ? timeout->signal : SIGKILL;
39 }
40 
HYD_get_time_left(struct timeout_s * timeout)41 int HYD_get_time_left(struct timeout_s *timeout)
42 {
43     if (timeout->sec <= 0) {
44         return -1;
45     }
46 
47     int time_diff = (int) difftime(get_current_time(), timeout->start_time);
48 
49     int time_left = timeout->sec - time_diff;
50     return (time_left > 0) ? time_left : 0;
51 }
52 
HYD_check_timed_out(struct timeout_s * timeout,int * exit_status)53 void HYD_check_timed_out(struct timeout_s *timeout, int *exit_status)
54 {
55     if (!timeout->timed_out) {
56         return;
57     }
58 
59     HYD_print_timeout_message(timeout);
60     *exit_status |= 1;
61 }
62 
HYD_print_timeout_message(struct timeout_s * timeout)63 void HYD_print_timeout_message(struct timeout_s *timeout)
64 {
65     HYD_PRINT_NOPREFIX(stdout,
66                        "MPIEXEC_TIMEOUT = %d second(s): job ending due to application timeout\n",
67                        timeout->sec);
68 }
69