b805d1e0a432b5b999a0e80a88a9430c04335633
[oweals/gnunet.git] / src / include / gnunet_time_lib.h
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2001-2013 GNUnet e.V.
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
19 */
20
21 /**
22  * @author Christian Grothoff
23  *
24  * @file
25  * Functions related to time
26  *
27  * @defgroup time  Time library
28  * Time and time calculations.
29  * @{
30  */
31
32 #ifndef GNUNET_TIME_LIB_H
33 #define GNUNET_TIME_LIB_H
34
35 #ifdef __cplusplus
36 extern "C"
37 {
38 #if 0                           /* keep Emacsens' auto-indent happy */
39 }
40 #endif
41 #endif
42
43 #include "gnunet_common.h"
44
45 /**
46  * Time for absolute times used by GNUnet, in microseconds.
47  */
48 struct GNUNET_TIME_Absolute
49 {
50   /**
51    * The actual value.
52    */
53   uint64_t abs_value_us;
54 };
55
56 /**
57  * Time for relative time used by GNUnet, in microseconds.
58  * Always positive, so we can only refer to future time.
59  */
60 struct GNUNET_TIME_Relative
61 {
62   /**
63    * The actual value.
64    */
65   uint64_t rel_value_us;
66 };
67
68 GNUNET_NETWORK_STRUCT_BEGIN
69
70 /**
71  * Time for relative time used by GNUnet, in microseconds and in network byte order.
72  */
73 struct GNUNET_TIME_RelativeNBO
74 {
75   /**
76    * The actual value (in network byte order).
77    */
78   uint64_t rel_value_us__ GNUNET_PACKED;
79 };
80
81
82 /**
83  * Time for absolute time used by GNUnet, in microseconds and in network byte order.
84  */
85 struct GNUNET_TIME_AbsoluteNBO
86 {
87   /**
88    * The actual value (in network byte order).
89    */
90   uint64_t abs_value_us__ GNUNET_PACKED;
91 };
92 GNUNET_NETWORK_STRUCT_END
93
94 /**
95  * Relative time zero.
96  */
97 #define GNUNET_TIME_UNIT_ZERO     GNUNET_TIME_relative_get_zero_()
98
99 /**
100  * Absolute time zero.
101  */
102 #define GNUNET_TIME_UNIT_ZERO_ABS GNUNET_TIME_absolute_get_zero_()
103
104 /**
105  * One microsecond, our basic time unit.
106  */
107 #define GNUNET_TIME_UNIT_MICROSECONDS GNUNET_TIME_relative_get_unit_()
108
109 /**
110  * One millisecond.
111  */
112 #define GNUNET_TIME_UNIT_MILLISECONDS GNUNET_TIME_relative_get_millisecond_()
113
114 /**
115  * One second.
116  */
117 #define GNUNET_TIME_UNIT_SECONDS GNUNET_TIME_relative_get_second_()
118
119 /**
120  * One minute.
121  */
122 #define GNUNET_TIME_UNIT_MINUTES GNUNET_TIME_relative_get_minute_()
123
124 /**
125  * One hour.
126  */
127 #define GNUNET_TIME_UNIT_HOURS   GNUNET_TIME_relative_get_hour_()
128
129 /**
130  * One day.
131  */
132 #define GNUNET_TIME_UNIT_DAYS    GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_HOURS,   24)
133
134 /**
135  * One week.
136  */
137 #define GNUNET_TIME_UNIT_WEEKS   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_DAYS,     7)
138
139 /**
140  * One month (30 days).
141  */
142 #define GNUNET_TIME_UNIT_MONTHS  GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_DAYS,    30)
143
144 /**
145  * One year (365 days).
146  */
147 #define GNUNET_TIME_UNIT_YEARS   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_DAYS,   365)
148
149 /**
150  * Constant used to specify "forever".  This constant
151  * will be treated specially in all time operations.
152  */
153 #define GNUNET_TIME_UNIT_FOREVER_REL GNUNET_TIME_relative_get_forever_ ()
154
155 /**
156  * Constant used to specify "forever".  This constant
157  * will be treated specially in all time operations.
158  */
159 #define GNUNET_TIME_UNIT_FOREVER_ABS GNUNET_TIME_absolute_get_forever_ ()
160
161
162
163 /**
164  * Threshold after which exponential backoff should not increase (15 m).
165  */
166 #define GNUNET_TIME_STD_EXPONENTIAL_BACKOFF_THRESHOLD GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
167
168
169 /**
170  * Perform our standard exponential back-off calculation, starting at 1 ms
171  * and then going by a factor of 2 up unto a maximum of 15 m.
172  *
173  * @param r current backoff time, initially zero
174  */
175 #define GNUNET_TIME_STD_BACKOFF(r) GNUNET_TIME_relative_min (GNUNET_TIME_STD_EXPONENTIAL_BACKOFF_THRESHOLD, \
176    GNUNET_TIME_relative_multiply (GNUNET_TIME_relative_max (GNUNET_TIME_UNIT_MILLISECONDS, (r)), 2));
177
178 /**
179  * Return relative time of 0ms.
180  */
181 struct GNUNET_TIME_Relative
182 GNUNET_TIME_relative_get_zero_ (void);
183
184
185 /**
186  * Return absolute time of 0ms.
187  */
188 struct GNUNET_TIME_Absolute
189 GNUNET_TIME_absolute_get_zero_ (void);
190
191
192 /**
193  * Return relative time of 1 microsecond.
194  */
195 struct GNUNET_TIME_Relative
196 GNUNET_TIME_relative_get_unit_ (void);
197
198
199 /**
200  * Return relative time of 1ms.
201  */
202 struct GNUNET_TIME_Relative
203 GNUNET_TIME_relative_get_millisecond_ (void);
204
205
206 /**
207  * Return relative time of 1s.
208  */
209 struct GNUNET_TIME_Relative
210 GNUNET_TIME_relative_get_second_ (void);
211
212
213 /**
214  * Return relative time of 1 minute.
215  */
216 struct GNUNET_TIME_Relative
217 GNUNET_TIME_relative_get_minute_ (void);
218
219
220 /**
221  * Return relative time of 1 hour.
222  */
223 struct GNUNET_TIME_Relative
224 GNUNET_TIME_relative_get_hour_ (void);
225
226
227 /**
228  * Return "forever".
229  */
230 struct GNUNET_TIME_Relative
231 GNUNET_TIME_relative_get_forever_ (void);
232
233
234 /**
235  * Return "forever".
236  */
237 struct GNUNET_TIME_Absolute
238 GNUNET_TIME_absolute_get_forever_ (void);
239
240
241 /**
242  * Get the current time.
243  *
244  * @return the current time
245  */
246 struct GNUNET_TIME_Absolute
247 GNUNET_TIME_absolute_get (void);
248
249
250 /**
251  * Convert relative time to an absolute time in the
252  * future.
253  *
254  * @param rel relative time to convert
255  * @return timestamp that is "rel" in the future, or FOREVER if rel==FOREVER (or if we would overflow)
256  */
257 struct GNUNET_TIME_Absolute
258 GNUNET_TIME_relative_to_absolute (struct GNUNET_TIME_Relative rel);
259
260
261 /**
262  * Return the minimum of two relative time values.
263  *
264  * @param t1 first timestamp
265  * @param t2 other timestamp
266  * @return timestamp that is smaller
267  */
268 struct GNUNET_TIME_Relative
269 GNUNET_TIME_relative_min (struct GNUNET_TIME_Relative t1,
270                           struct GNUNET_TIME_Relative t2);
271
272
273
274 /**
275  * Return the maximum of two relative time values.
276  *
277  * @param t1 first timestamp
278  * @param t2 other timestamp
279  * @return timestamp that is larger
280  */
281 struct GNUNET_TIME_Relative
282 GNUNET_TIME_relative_max (struct GNUNET_TIME_Relative t1,
283                           struct GNUNET_TIME_Relative t2);
284
285
286 /**
287  * Return the minimum of two absolute time values.
288  *
289  * @param t1 first timestamp
290  * @param t2 other timestamp
291  * @return timestamp that is smaller
292  */
293 struct GNUNET_TIME_Absolute
294 GNUNET_TIME_absolute_min (struct GNUNET_TIME_Absolute t1,
295                           struct GNUNET_TIME_Absolute t2);
296
297
298 /**
299  * Return the maximum of two absolute time values.
300  *
301  * @param t1 first timestamp
302  * @param t2 other timestamp
303  * @return timestamp that is smaller
304  */
305 struct GNUNET_TIME_Absolute
306 GNUNET_TIME_absolute_max (struct GNUNET_TIME_Absolute t1,
307                           struct GNUNET_TIME_Absolute t2);
308
309
310 /**
311  * Given a timestamp in the future, how much time
312  * remains until then?
313  *
314  * @param future some absolute time, typically in the future
315  * @return future - now, or 0 if now >= future, or FOREVER if future==FOREVER.
316  */
317 struct GNUNET_TIME_Relative
318 GNUNET_TIME_absolute_get_remaining (struct GNUNET_TIME_Absolute future);
319
320
321 /**
322  * Calculate the estimate time of arrival/completion
323  * for an operation.
324  *
325  * @param start when did the operation start?
326  * @param finished how much has been done?
327  * @param total how much must be done overall (same unit as for "finished")
328  * @return remaining duration for the operation,
329  *        assuming it continues at the same speed
330  */
331 struct GNUNET_TIME_Relative
332 GNUNET_TIME_calculate_eta (struct GNUNET_TIME_Absolute start, uint64_t finished,
333                            uint64_t total);
334
335
336 /**
337  * Compute the time difference between the given start and end times.
338  * Use this function instead of actual subtraction to ensure that
339  * "FOREVER" and overflows are handeled correctly.
340  *
341  * @param start some absolute time
342  * @param end some absolute time (typically larger or equal to start)
343  * @return 0 if start >= end; FOREVER if end==FOREVER; otherwise end - start
344  */
345 struct GNUNET_TIME_Relative
346 GNUNET_TIME_absolute_get_difference (struct GNUNET_TIME_Absolute start,
347                                      struct GNUNET_TIME_Absolute end);
348
349
350 /**
351  * Get the duration of an operation as the
352  * difference of the current time and the given start time "hence".
353  *
354  * @param whence some absolute time, typically in the past
355  * @return 0 if hence > now, otherwise now-hence.
356  */
357 struct GNUNET_TIME_Relative
358 GNUNET_TIME_absolute_get_duration (struct GNUNET_TIME_Absolute whence);
359
360
361 /**
362  * Add a given relative duration to the
363  * given start time.
364  *
365  * @param start some absolute time
366  * @param duration some relative time to add
367  * @return FOREVER if either argument is FOREVER or on overflow; start+duration otherwise
368  */
369 struct GNUNET_TIME_Absolute
370 GNUNET_TIME_absolute_add (struct GNUNET_TIME_Absolute start,
371                           struct GNUNET_TIME_Relative duration);
372
373
374 /**
375  * Subtract a given relative duration from the
376  * given start time.
377  *
378  * @param start some absolute time
379  * @param duration some relative time to subtract
380  * @return ZERO if start <= duration, or FOREVER if start time is FOREVER; start-duration otherwise
381  */
382 struct GNUNET_TIME_Absolute
383 GNUNET_TIME_absolute_subtract (struct GNUNET_TIME_Absolute start,
384                                struct GNUNET_TIME_Relative duration);
385
386
387 /**
388  * Multiply relative time by a given factor.
389  *
390  * @param rel some duration
391  * @param factor integer to multiply with
392  * @return FOREVER if rel=FOREVER or on overflow; otherwise rel*factor
393  */
394 struct GNUNET_TIME_Relative
395 GNUNET_TIME_relative_multiply (struct GNUNET_TIME_Relative rel,
396                                unsigned int factor);
397
398
399 /**
400  * Divide relative time by a given factor.
401  *
402  * @param rel some duration
403  * @param factor integer to divide by
404  * @return FOREVER if rel=FOREVER or factor==0; otherwise rel/factor
405  */
406 struct GNUNET_TIME_Relative
407 GNUNET_TIME_relative_divide (struct GNUNET_TIME_Relative rel,
408                              unsigned int factor);
409
410
411 /**
412  * Add relative times together.
413  *
414  * @param a1 some relative time
415  * @param a2 some other relative time
416  * @return FOREVER if either argument is FOREVER or on overflow; a1+a2 otherwise
417  */
418 struct GNUNET_TIME_Relative
419 GNUNET_TIME_relative_add (struct GNUNET_TIME_Relative a1,
420                           struct GNUNET_TIME_Relative a2);
421
422
423 /**
424  * Subtract relative timestamp from the other.
425  *
426  * @param a1 first timestamp
427  * @param a2 second timestamp
428  * @return ZERO if a2>=a1 (including both FOREVER), FOREVER if a1 is FOREVER, a1-a2 otherwise
429  */
430 struct GNUNET_TIME_Relative
431 GNUNET_TIME_relative_subtract (struct GNUNET_TIME_Relative a1,
432                                struct GNUNET_TIME_Relative a2);
433
434
435 /**
436  * Convert relative time to network byte order.
437  *
438  * @param a time to convert
439  * @return converted time value
440  */
441 struct GNUNET_TIME_RelativeNBO
442 GNUNET_TIME_relative_hton (struct GNUNET_TIME_Relative a);
443
444
445 /**
446  * Convert relative time from network byte order.
447  *
448  * @param a time to convert
449  * @return converted time value
450  */
451 struct GNUNET_TIME_Relative
452 GNUNET_TIME_relative_ntoh (struct GNUNET_TIME_RelativeNBO a);
453
454
455 /**
456  * Convert absolute time to network byte order.
457  *
458  * @param a time to convert
459  * @return converted time value
460  */
461 struct GNUNET_TIME_AbsoluteNBO
462 GNUNET_TIME_absolute_hton (struct GNUNET_TIME_Absolute a);
463
464
465 /**
466  * Convert absolute time from network byte order.
467  *
468  * @param a time to convert
469  * @return converted time value
470  */
471 struct GNUNET_TIME_Absolute
472 GNUNET_TIME_absolute_ntoh (struct GNUNET_TIME_AbsoluteNBO a);
473
474
475 /**
476  * Set the timestamp offset for this instance.
477  *
478  * @param offset the offset to skew the locale time by
479  */
480 void
481 GNUNET_TIME_set_offset (long long offset);
482
483
484 /**
485  * Get the timestamp offset for this instance.
486  *
487  * @return the offset we currently skew the locale time by
488  */
489 long long
490 GNUNET_TIME_get_offset (void);
491
492
493 /**
494  * Return the current year (i.e. '2011').
495  */
496 unsigned int
497 GNUNET_TIME_get_current_year (void);
498
499
500 /**
501  * Convert a year to an expiration time of January 1st of that year.
502  *
503  * @param year a year (after 1970, please ;-)).
504  * @return absolute time for January 1st of that year.
505  */
506 struct GNUNET_TIME_Absolute
507 GNUNET_TIME_year_to_time (unsigned int year);
508
509
510 /**
511  * Convert an expiration time to the respective year (rounds)
512  *
513  * @param at absolute time
514  * @return year a year (after 1970), 0 on error
515  */
516 unsigned int
517 GNUNET_TIME_time_to_year (struct GNUNET_TIME_Absolute at);
518
519
520 #if 0                           /* keep Emacsens' auto-indent happy */
521 {
522 #endif
523 #ifdef __cplusplus
524 }
525 #endif
526
527 /* ifndef GNUNET_TIME_LIB_H */
528 #endif
529
530 /** @} */ /* end of group time */
531
532 /* end of gnunet_time_lib.h */