-migrating ATS tests to new transport (and core) API; core tests disabled as new...
[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  * Round a time value so that it is suitable for transmission
263  * via JSON encodings.
264  *
265  * @param at time to round
266  * @return #GNUNET_OK if time was already rounded, #GNUNET_NO if
267  *         it was just now rounded
268  */
269 int
270 GNUNET_TIME_round_abs (struct GNUNET_TIME_Absolute *at);
271
272
273 /**
274  * Round a time value so that it is suitable for transmission
275  * via JSON encodings.
276  *
277  * @param rt time to round
278  * @return #GNUNET_OK if time was already rounded, #GNUNET_NO if
279  *         it was just now rounded
280  */
281 int
282 GNUNET_TIME_round_rel (struct GNUNET_TIME_Relative *rt);
283
284
285 /**
286  * Return the minimum of two relative time values.
287  *
288  * @param t1 first timestamp
289  * @param t2 other timestamp
290  * @return timestamp that is smaller
291  */
292 struct GNUNET_TIME_Relative
293 GNUNET_TIME_relative_min (struct GNUNET_TIME_Relative t1,
294                           struct GNUNET_TIME_Relative t2);
295
296
297
298 /**
299  * Return the maximum of two relative time values.
300  *
301  * @param t1 first timestamp
302  * @param t2 other timestamp
303  * @return timestamp that is larger
304  */
305 struct GNUNET_TIME_Relative
306 GNUNET_TIME_relative_max (struct GNUNET_TIME_Relative t1,
307                           struct GNUNET_TIME_Relative t2);
308
309
310 /**
311  * Return the minimum of two absolute time values.
312  *
313  * @param t1 first timestamp
314  * @param t2 other timestamp
315  * @return timestamp that is smaller
316  */
317 struct GNUNET_TIME_Absolute
318 GNUNET_TIME_absolute_min (struct GNUNET_TIME_Absolute t1,
319                           struct GNUNET_TIME_Absolute t2);
320
321
322 /**
323  * Return the maximum of two absolute time values.
324  *
325  * @param t1 first timestamp
326  * @param t2 other timestamp
327  * @return timestamp that is smaller
328  */
329 struct GNUNET_TIME_Absolute
330 GNUNET_TIME_absolute_max (struct GNUNET_TIME_Absolute t1,
331                           struct GNUNET_TIME_Absolute t2);
332
333
334 /**
335  * Given a timestamp in the future, how much time
336  * remains until then?
337  *
338  * @param future some absolute time, typically in the future
339  * @return future - now, or 0 if now >= future, or FOREVER if future==FOREVER.
340  */
341 struct GNUNET_TIME_Relative
342 GNUNET_TIME_absolute_get_remaining (struct GNUNET_TIME_Absolute future);
343
344
345 /**
346  * Calculate the estimate time of arrival/completion
347  * for an operation.
348  *
349  * @param start when did the operation start?
350  * @param finished how much has been done?
351  * @param total how much must be done overall (same unit as for "finished")
352  * @return remaining duration for the operation,
353  *        assuming it continues at the same speed
354  */
355 struct GNUNET_TIME_Relative
356 GNUNET_TIME_calculate_eta (struct GNUNET_TIME_Absolute start, uint64_t finished,
357                            uint64_t total);
358
359
360 /**
361  * Compute the time difference between the given start and end times.
362  * Use this function instead of actual subtraction to ensure that
363  * "FOREVER" and overflows are handeled correctly.
364  *
365  * @param start some absolute time
366  * @param end some absolute time (typically larger or equal to start)
367  * @return 0 if start >= end; FOREVER if end==FOREVER; otherwise end - start
368  */
369 struct GNUNET_TIME_Relative
370 GNUNET_TIME_absolute_get_difference (struct GNUNET_TIME_Absolute start,
371                                      struct GNUNET_TIME_Absolute end);
372
373
374 /**
375  * Get the duration of an operation as the
376  * difference of the current time and the given start time "hence".
377  *
378  * @param whence some absolute time, typically in the past
379  * @return 0 if hence > now, otherwise now-hence.
380  */
381 struct GNUNET_TIME_Relative
382 GNUNET_TIME_absolute_get_duration (struct GNUNET_TIME_Absolute whence);
383
384
385 /**
386  * Add a given relative duration to the
387  * given start time.
388  *
389  * @param start some absolute time
390  * @param duration some relative time to add
391  * @return FOREVER if either argument is FOREVER or on overflow; start+duration otherwise
392  */
393 struct GNUNET_TIME_Absolute
394 GNUNET_TIME_absolute_add (struct GNUNET_TIME_Absolute start,
395                           struct GNUNET_TIME_Relative duration);
396
397
398 /**
399  * Subtract a given relative duration from the
400  * given start time.
401  *
402  * @param start some absolute time
403  * @param duration some relative time to subtract
404  * @return ZERO if start <= duration, or FOREVER if start time is FOREVER; start-duration otherwise
405  */
406 struct GNUNET_TIME_Absolute
407 GNUNET_TIME_absolute_subtract (struct GNUNET_TIME_Absolute start,
408                                struct GNUNET_TIME_Relative duration);
409
410
411 /**
412  * Multiply relative time by a given factor.
413  *
414  * @param rel some duration
415  * @param factor integer to multiply with
416  * @return FOREVER if rel=FOREVER or on overflow; otherwise rel*factor
417  */
418 struct GNUNET_TIME_Relative
419 GNUNET_TIME_relative_multiply (struct GNUNET_TIME_Relative rel,
420                                unsigned long long factor);
421
422
423 /**
424  * Divide relative time by a given factor.
425  *
426  * @param rel some duration
427  * @param factor integer to divide by
428  * @return FOREVER if rel=FOREVER or factor==0; otherwise rel/factor
429  */
430 struct GNUNET_TIME_Relative
431 GNUNET_TIME_relative_divide (struct GNUNET_TIME_Relative rel,
432                              unsigned long long factor);
433
434
435 /**
436  * Add relative times together.
437  *
438  * @param a1 some relative time
439  * @param a2 some other relative time
440  * @return FOREVER if either argument is FOREVER or on overflow; a1+a2 otherwise
441  */
442 struct GNUNET_TIME_Relative
443 GNUNET_TIME_relative_add (struct GNUNET_TIME_Relative a1,
444                           struct GNUNET_TIME_Relative a2);
445
446
447 /**
448  * Subtract relative timestamp from the other.
449  *
450  * @param a1 first timestamp
451  * @param a2 second timestamp
452  * @return ZERO if a2>=a1 (including both FOREVER), FOREVER if a1 is FOREVER, a1-a2 otherwise
453  */
454 struct GNUNET_TIME_Relative
455 GNUNET_TIME_relative_subtract (struct GNUNET_TIME_Relative a1,
456                                struct GNUNET_TIME_Relative a2);
457
458
459 /**
460  * Convert relative time to network byte order.
461  *
462  * @param a time to convert
463  * @return converted time value
464  */
465 struct GNUNET_TIME_RelativeNBO
466 GNUNET_TIME_relative_hton (struct GNUNET_TIME_Relative a);
467
468
469 /**
470  * Convert relative time from network byte order.
471  *
472  * @param a time to convert
473  * @return converted time value
474  */
475 struct GNUNET_TIME_Relative
476 GNUNET_TIME_relative_ntoh (struct GNUNET_TIME_RelativeNBO a);
477
478
479 /**
480  * Convert absolute time to network byte order.
481  *
482  * @param a time to convert
483  * @return converted time value
484  */
485 struct GNUNET_TIME_AbsoluteNBO
486 GNUNET_TIME_absolute_hton (struct GNUNET_TIME_Absolute a);
487
488
489 /**
490  * Convert absolute time from network byte order.
491  *
492  * @param a time to convert
493  * @return converted time value
494  */
495 struct GNUNET_TIME_Absolute
496 GNUNET_TIME_absolute_ntoh (struct GNUNET_TIME_AbsoluteNBO a);
497
498
499 /**
500  * Set the timestamp offset for this instance.
501  *
502  * @param offset the offset to skew the locale time by
503  */
504 void
505 GNUNET_TIME_set_offset (long long offset);
506
507
508 /**
509  * Get the timestamp offset for this instance.
510  *
511  * @return the offset we currently skew the locale time by
512  */
513 long long
514 GNUNET_TIME_get_offset (void);
515
516
517 /**
518  * Return the current year (i.e. '2011').
519  */
520 unsigned int
521 GNUNET_TIME_get_current_year (void);
522
523
524 /**
525  * Convert a year to an expiration time of January 1st of that year.
526  *
527  * @param year a year (after 1970, please ;-)).
528  * @return absolute time for January 1st of that year.
529  */
530 struct GNUNET_TIME_Absolute
531 GNUNET_TIME_year_to_time (unsigned int year);
532
533
534 /**
535  * Convert an expiration time to the respective year (rounds)
536  *
537  * @param at absolute time
538  * @return year a year (after 1970), 0 on error
539  */
540 unsigned int
541 GNUNET_TIME_time_to_year (struct GNUNET_TIME_Absolute at);
542
543
544 #if 0                           /* keep Emacsens' auto-indent happy */
545 {
546 #endif
547 #ifdef __cplusplus
548 }
549 #endif
550
551 /* ifndef GNUNET_TIME_LIB_H */
552 #endif
553
554 /** @} */ /* end of group time */
555
556 /* end of gnunet_time_lib.h */