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)9static time_t get_current_time(void) 10 { 11 return time(NULL); 12 } 13 HYD_init_timeout(int sec,struct timeout_s * timeout)14void 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)23void 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)31void HYD_handle_sigalrm(struct timeout_s *timeout) 32 { 33 timeout->timed_out = 1; 34 } 35 HYD_get_timeout_signal(struct timeout_s * timeout)36int 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)41int 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)53void 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)63void 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