Line data Source code
1 : /* SPDX-License-Identifier: LGPL-2.1+ */ 2 : #pragma once 3 : 4 : typedef struct Timer Timer; 5 : 6 : #include "calendarspec.h" 7 : #include "unit.h" 8 : 9 : typedef enum TimerBase { 10 : TIMER_ACTIVE, 11 : TIMER_BOOT, 12 : TIMER_STARTUP, 13 : TIMER_UNIT_ACTIVE, 14 : TIMER_UNIT_INACTIVE, 15 : TIMER_CALENDAR, 16 : _TIMER_BASE_MAX, 17 : _TIMER_BASE_INVALID = -1 18 : } TimerBase; 19 : 20 : typedef struct TimerValue { 21 : TimerBase base; 22 : bool disabled; 23 : 24 : usec_t value; /* only for monotonic events */ 25 : CalendarSpec *calendar_spec; /* only for calendar events */ 26 : usec_t next_elapse; 27 : 28 : LIST_FIELDS(struct TimerValue, value); 29 : } TimerValue; 30 : 31 : typedef enum TimerResult { 32 : TIMER_SUCCESS, 33 : TIMER_FAILURE_RESOURCES, 34 : TIMER_FAILURE_START_LIMIT_HIT, 35 : _TIMER_RESULT_MAX, 36 : _TIMER_RESULT_INVALID = -1 37 : } TimerResult; 38 : 39 : struct Timer { 40 : Unit meta; 41 : 42 : usec_t accuracy_usec; 43 : usec_t random_usec; 44 : 45 : LIST_HEAD(TimerValue, values); 46 : usec_t next_elapse_realtime; 47 : usec_t next_elapse_monotonic_or_boottime; 48 : dual_timestamp last_trigger; 49 : 50 : TimerState state, deserialized_state; 51 : 52 : sd_event_source *monotonic_event_source; 53 : sd_event_source *realtime_event_source; 54 : 55 : TimerResult result; 56 : 57 : bool persistent; 58 : bool wake_system; 59 : bool remain_after_elapse; 60 : bool on_clock_change; 61 : bool on_timezone_change; 62 : 63 : char *stamp_path; 64 : }; 65 : 66 : #define TIMER_MONOTONIC_CLOCK(t) ((t)->wake_system && clock_boottime_supported() ? CLOCK_BOOTTIME_ALARM : CLOCK_MONOTONIC) 67 : 68 : void timer_free_values(Timer *t); 69 : 70 : extern const UnitVTable timer_vtable; 71 : 72 : const char *timer_base_to_string(TimerBase i) _const_; 73 : TimerBase timer_base_from_string(const char *s) _pure_; 74 : 75 : const char* timer_result_to_string(TimerResult i) _const_; 76 : TimerResult timer_result_from_string(const char *s) _pure_; 77 : 78 0 : DEFINE_CAST(TIMER, Timer);