4 #include <kernel/kernel.h>
5 #include <System/Time.h>
7 #include <util/spinlock.h>
10 static inline void fix_time_add(System::Time::Time &time)
12 if (time.nanos >= 1000000000) {
13 time.nanos -= 1000000000;
18 static inline void fix_time_sub(System::Time::Time &time)
20 if ((int32_t)time.nanos < 0) {
21 time.nanos += 1000000000;
27 static inline long operator < (const System::Time::Time &left,
28 const System::Time::Time &right)
30 return left.seconds - right.seconds < 0 ||
31 (left.seconds == right.seconds &&
32 left.nanos < right.nanos);
35 static inline long operator == (const System::Time::Time &left,
36 const System::Time::Time &right)
38 return left.seconds == right.seconds &&
39 left.nanos == right.nanos;
42 static inline long operator != (const System::Time::Time &left,
43 const System::Time::Time &right)
45 return left.seconds != right.seconds ||
46 left.nanos != right.nanos;
49 static inline System::Time::Time operator +(const System::Time::Time &left,
50 const System::Time::Time &right)
52 System::Time::Time ret;
54 ret.seconds = left.seconds + right.seconds;
55 ret.nanos = left.nanos + right.nanos;
57 Time::fix_time_add(ret);
61 static inline System::Time::Time &operator +=(System::Time::Time &left,
62 const System::Time::Time &right)
64 left.seconds += right.seconds;
65 left.nanos += right.nanos;
67 Time::fix_time_add(left);
71 static inline System::Time::Time operator -(const System::Time::Time &left,
72 const System::Time::Time &right)
74 System::Time::Time ret;
76 ret.seconds = left.seconds - right.seconds;
77 ret.nanos = left.nanos - right.nanos;
79 Time::fix_time_sub(ret);
83 static inline System::Time::Time &operator -=(System::Time::Time &left,
84 const System::Time::Time &right)
86 left.seconds -= right.seconds;
87 left.nanos -= right.nanos;
89 Time::fix_time_sub(left);
93 static inline System::Time::Time operator +(const System::Time::Time &left,
96 System::Time::Time ret;
98 ret.seconds = left.seconds;
99 ret.nanos = left.nanos + right;
101 Time::fix_time_add(ret);
105 static inline System::Time::Time &operator +=(System::Time::Time &left,
110 Time::fix_time_add(left);
114 static inline System::Time::Time operator -(const System::Time::Time &left,
117 System::Time::Time ret;
119 ret.seconds = left.seconds;
120 ret.nanos = left.nanos - right;
122 Time::fix_time_sub(ret);
126 static inline System::Time::Time &operator -=(System::Time::Time &left,
131 Time::fix_time_sub(left);
136 typedef System::Time::Clock Clock;
137 typedef System::Time::Time Time;
138 typedef System::Time::ITime ITime;
139 typedef System::Time::Timer Timer;
140 typedef System::Time::ITimer ITimer;
142 using namespace Lock;
146 Util::Heap<TimerEntry> heap;
152 TimerMux(Clock CLOCK, Timer PARENT) :
153 clock(CLOCK), parent(PARENT)
157 void arm(TimerEntry *entry, Time expiry);
158 void disarm(TimerEntry *entry);
163 Util::Heap<TimerEntry>::Node heap_node;
167 #include _KERNEL_SERVER(time/timer/Time/TimerEntry.h)
169 TimerEntry(TimerMux *MUX = NULL) : mux(MUX)
177 virtual ~TimerEntry()
181 void arm(Time expiry)
183 mux->arm(this, expiry);
191 void get_expiry(Time *ret, uint8_t *was_armed)
193 if (!ret || !was_armed) {
194 // FIXME: throw exception
206 long operator < (TimerEntry &other)
208 return expiry < other.expiry;
213 return heap_node.is_on_heap();
216 void set_action(System::Events::Event *event);
218 // This can be overridden in low-level code (specifically
219 // the kernel) to execute the action synchronously,
220 // inside the timer critical section. Most code should
221 // (and non-C++ code must) use set_action instead.
223 virtual void action();