1 /* Asynchronous timers. 2 Copyright (C) 2000-2023 Free Software Foundation, Inc. 3 4 This file is part of GNU Emacs. 5 6 GNU Emacs is free software: you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or (at 9 your option) any later version. 10 11 GNU Emacs is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ 18 19 #ifndef EMACS_ATIMER_H 20 #define EMACS_ATIMER_H 21 22 #include <time.h> 23 24 /* Forward declaration. */ 25 26 struct atimer; 27 28 /* Types of timers. */ 29 30 enum atimer_type 31 { 32 /* Timer is ripe at some absolute time. */ 33 ATIMER_ABSOLUTE, 34 35 /* Timer is ripe at now plus an offset. */ 36 ATIMER_RELATIVE, 37 38 /* Timer runs continuously. */ 39 ATIMER_CONTINUOUS 40 }; 41 42 /* Type of timer callback functions. */ 43 44 typedef void (* atimer_callback) (struct atimer *timer); 45 46 /* Structure describing an asynchronous timer. */ 47 48 struct atimer 49 { 50 /* The type of this timer. */ 51 enum atimer_type type; 52 53 /* Time when this timer is ripe. */ 54 struct timespec expiration; 55 56 /* Interval of this timer. */ 57 struct timespec interval; 58 59 /* Function to call when timer is ripe. Interrupt input is 60 guaranteed to not be blocked when this function is called. */ 61 atimer_callback fn; 62 63 /* Additional user-specified data to pass to FN. */ 64 void *client_data; 65 66 /* Next in list of active or free atimers. */ 67 struct atimer *next; 68 }; 69 70 /* Function prototypes. */ 71 72 struct atimer *start_atimer (enum atimer_type, struct timespec, 73 atimer_callback, void *); 74 void cancel_atimer (struct atimer *); 75 void do_pending_atimers (void); 76 void init_atimer (void); 77 void turn_on_atimers (bool); 78 void stop_other_atimers (struct atimer *); 79 void run_all_atimers (void); 80 #ifdef HAVE_TIMERFD 81 void timerfd_callback (int, void *); 82 #endif 83 84 #endif /* EMACS_ATIMER_H */