indentation
[oweals/gnunet.git] / src / include / gnunet_time_lib.h
1 /*
2      This file is part of GNUnet.
3      (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 Christian Grothoff (and other contributing authors)
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 2, 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., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file include/gnunet_time_lib.h
23  * @brief functions related to time
24  *
25  * @author Christian Grothoff
26  */
27
28 #ifndef GNUNET_TIME_LIB_H
29 #define GNUNET_TIME_LIB_H
30
31 #ifdef __cplusplus
32 extern "C"
33 {
34 #if 0                           /* keep Emacsens' auto-indent happy */
35 }
36 #endif
37 #endif
38
39 #include "gnunet_common.h"
40
41 /**
42  * Time for absolute times used by GNUnet, in milliseconds.
43  */
44 struct GNUNET_TIME_Absolute
45 {
46   /**
47    * The actual value.
48    */
49   uint64_t abs_value;
50 };
51
52 /**
53  * Time for relative time used by GNUnet, in milliseconds.
54  * Always positive, so we can only refer to future time.
55  */
56 struct GNUNET_TIME_Relative
57 {
58   /**
59    * The actual value.
60    */
61   uint64_t rel_value;
62 };
63
64
65 /**
66  * Time for relative time used by GNUnet, in milliseconds and in network byte order.
67  */
68 struct GNUNET_TIME_RelativeNBO
69 {
70   /**
71    * The actual value (in network byte order).
72    */
73   uint64_t rel_value__ GNUNET_PACKED;
74 };
75
76
77 /**
78  * Time for absolute time used by GNUnet, in milliseconds and in network byte order.
79  */
80 struct GNUNET_TIME_AbsoluteNBO
81 {
82   /**
83    * The actual value (in network byte order).
84    */
85   uint64_t abs_value__ GNUNET_PACKED;
86 };
87
88
89 /**
90  * Relative time zero.
91  */
92 #define GNUNET_TIME_UNIT_ZERO     GNUNET_TIME_relative_get_zero()
93
94 /**
95  * Absolute time zero.
96  */
97 #define GNUNET_TIME_UNIT_ZERO_ABS GNUNET_TIME_absolute_get_zero()
98
99 /**
100  * One millisecond, our basic time unit.
101  */
102 #define GNUNET_TIME_UNIT_MILLISECONDS GNUNET_TIME_relative_get_unit()
103
104 /**
105  * One second.
106  */
107 #define GNUNET_TIME_UNIT_SECONDS GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 1000)
108
109 /**
110  * One minute.
111  */
112 #define GNUNET_TIME_UNIT_MINUTES GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 60)
113
114 /**
115  * One hour.
116  */
117 #define GNUNET_TIME_UNIT_HOURS   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 60)
118
119 /**
120  * One day.
121  */
122 #define GNUNET_TIME_UNIT_DAYS    GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_HOURS,   24)
123
124 /**
125  * One week.
126  */
127 #define GNUNET_TIME_UNIT_WEEKS   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_DAYS,     7)
128
129 /**
130  * One month (30 days).
131  */
132 #define GNUNET_TIME_UNIT_MONTHS  GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_DAYS,    30)
133
134 /**
135  * One year (365 days).
136  */
137 #define GNUNET_TIME_UNIT_YEARS   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_DAYS,   365)
138
139 /**
140  * Constant used to specify "forever".  This constant
141  * will be treated specially in all time operations.
142  */
143 #define GNUNET_TIME_UNIT_FOREVER_REL GNUNET_TIME_relative_get_forever ()
144
145 /**
146  * Constant used to specify "forever".  This constant
147  * will be treated specially in all time operations.
148  */
149 #define GNUNET_TIME_UNIT_FOREVER_ABS GNUNET_TIME_absolute_get_forever ()
150
151 /**
152  * Return relative time of 0ms.
153  */
154 struct GNUNET_TIME_Relative GNUNET_TIME_relative_get_zero (void);
155
156 /**
157  * Return absolute time of 0ms.
158  */
159 struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get_zero (void);
160
161 /**
162  * Return relative time of 1ms.
163  */
164 struct GNUNET_TIME_Relative GNUNET_TIME_relative_get_unit (void);
165
166 /**
167  * Return "forever".
168  */
169 struct GNUNET_TIME_Relative GNUNET_TIME_relative_get_forever (void);
170
171 /**
172  * Return "forever".
173  */
174 struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get_forever (void);
175
176 /**
177  * Get the current time.
178  *
179  * @return the current time
180  */
181 struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get (void);
182
183 /**
184  * Convert relative time to an absolute time in the
185  * future.
186  *
187  * @param rel relative time to convert
188  * @return timestamp that is "rel" in the future, or FOREVER if rel==FOREVER (or if we would overflow)
189  */
190 struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute (struct
191                                                               GNUNET_TIME_Relative
192                                                               rel);
193
194 /**
195  * Return the minimum of two relative time values.
196  *
197  * @param t1 first timestamp
198  * @param t2 other timestamp
199  * @return timestamp that is smaller
200  */
201 struct GNUNET_TIME_Relative GNUNET_TIME_relative_min (struct
202                                                       GNUNET_TIME_Relative t1,
203                                                       struct
204                                                       GNUNET_TIME_Relative t2);
205
206
207 /**
208  * Return the maximum of two relative time values.
209  *
210  * @param t1 first timestamp
211  * @param t2 other timestamp
212  * @return timestamp that is larger
213  */
214 struct GNUNET_TIME_Relative GNUNET_TIME_relative_max (struct
215                                                       GNUNET_TIME_Relative t1,
216                                                       struct
217                                                       GNUNET_TIME_Relative t2);
218
219 /**
220  * Return the minimum of two absolute time values.
221  *
222  * @param t1 first timestamp
223  * @param t2 other timestamp
224  * @return timestamp that is smaller
225  */
226 struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_min (struct
227                                                       GNUNET_TIME_Absolute t1,
228                                                       struct
229                                                       GNUNET_TIME_Absolute t2);
230
231 /**
232  * Return the maximum of two absolute time values.
233  *
234  * @param t1 first timestamp
235  * @param t2 other timestamp
236  * @return timestamp that is smaller
237  */
238 struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_max (struct
239                                                       GNUNET_TIME_Absolute t1,
240                                                       struct
241                                                       GNUNET_TIME_Absolute t2);
242
243 /**
244  * Given a timestamp in the future, how much time
245  * remains until then?
246  *
247  * @param future some absolute time, typically in the future
248  * @return future - now, or 0 if now >= future, or FOREVER if future==FOREVER.
249  */
250 struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining (struct
251                                                                 GNUNET_TIME_Absolute
252                                                                 future);
253
254
255 /**
256  * Calculate the estimate time of arrival/completion 
257  * for an operation.
258  *
259  * @param start when did the operation start?
260  * @param finished how much has been done?
261  * @param total how much must be done overall (same unit as for "finished")
262  * @return remaining duration for the operation,
263  *        assuming it continues at the same speed
264  */
265 struct GNUNET_TIME_Relative GNUNET_TIME_calculate_eta (struct
266                                                        GNUNET_TIME_Absolute
267                                                        start, uint64_t finished,
268                                                        uint64_t total);
269
270
271 /**
272  * Compute the time difference between the given start and end times.
273  * Use this function instead of actual subtraction to ensure that
274  * "FOREVER" and overflows are handeled correctly.
275  *
276  * @param start some absolute time
277  * @param end some absolute time (typically larger or equal to start)
278  * @return 0 if start >= end; FOREVER if end==FOREVER; otherwise end - start
279  */
280 struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_difference (struct
281                                                                  GNUNET_TIME_Absolute
282                                                                  start,
283                                                                  struct
284                                                                  GNUNET_TIME_Absolute
285                                                                  end);
286
287 /**
288  * Get the duration of an operation as the
289  * difference of the current time and the given start time "hence".
290  *
291  * @param whence some absolute time, typically in the past
292  * @return aborts if hence==FOREVER, 0 if hence > now, otherwise now-hence.
293  */
294 struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_duration (struct
295                                                                GNUNET_TIME_Absolute
296                                                                whence);
297
298
299 /**
300  * Add a given relative duration to the
301  * given start time.
302  *
303  * @param start some absolute time
304  * @param duration some relative time to add
305  * @return FOREVER if either argument is FOREVER or on overflow; start+duration otherwise
306  */
307 struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_add (struct
308                                                       GNUNET_TIME_Absolute
309                                                       start,
310                                                       struct
311                                                       GNUNET_TIME_Relative
312                                                       duration);
313
314
315 /**
316  * Subtract a given relative duration from the
317  * given start time.
318  *
319  * @param start some absolute time
320  * @param duration some relative time to subtract
321  * @return ZERO if start <= duration, or FOREVER if start time is FOREVER; start-duration otherwise
322  */
323 struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_subtract (struct
324                                                            GNUNET_TIME_Absolute
325                                                            start,
326                                                            struct
327                                                            GNUNET_TIME_Relative
328                                                            duration);
329
330 /**
331  * Multiply relative time by a given factor.
332  *
333  * @param rel some duration
334  * @param factor integer to multiply with
335  * @return FOREVER if rel=FOREVER or on overflow; otherwise rel*factor
336  */
337 struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply (struct
338                                                            GNUNET_TIME_Relative
339                                                            rel,
340                                                            unsigned int factor);
341
342 /**
343  * Divide relative time by a given factor.
344  *
345  * @param rel some duration
346  * @param factor integer to divide by
347  * @return FOREVER if rel=FOREVER or factor==0; otherwise rel/factor
348  */
349 struct GNUNET_TIME_Relative GNUNET_TIME_relative_divide (struct
350                                                          GNUNET_TIME_Relative
351                                                          rel,
352                                                          unsigned int factor);
353
354 /**
355  * Add relative times together.
356  *
357  * @param a1 some relative time
358  * @param a2 some other relative time
359  * @return FOREVER if either argument is FOREVER or on overflow; a1+a2 otherwise
360  */
361 struct GNUNET_TIME_Relative GNUNET_TIME_relative_add (struct
362                                                       GNUNET_TIME_Relative a1,
363                                                       struct
364                                                       GNUNET_TIME_Relative a2);
365
366 /**
367  * Subtract relative timestamp from the other.
368  *
369  * @param a1 first timestamp
370  * @param a2 second timestamp
371  * @return ZERO if a2>=a1 (including both FOREVER), FOREVER if a1 is FOREVER, a1-a2 otherwise
372  */
373 struct GNUNET_TIME_Relative GNUNET_TIME_relative_subtract (struct
374                                                            GNUNET_TIME_Relative
375                                                            a1,
376                                                            struct
377                                                            GNUNET_TIME_Relative
378                                                            a2);
379
380
381 /**
382  * Convert relative time to network byte order.
383  * 
384  * @param a time to convert
385  * @return converted time value
386  */
387 struct GNUNET_TIME_RelativeNBO GNUNET_TIME_relative_hton (struct
388                                                           GNUNET_TIME_Relative
389                                                           a);
390
391 /**
392  * Convert relative time from network byte order.
393  *
394  * @param a time to convert
395  * @return converted time value
396  */
397 struct GNUNET_TIME_Relative GNUNET_TIME_relative_ntoh (struct
398                                                        GNUNET_TIME_RelativeNBO
399                                                        a);
400
401 /**
402  * Convert relative time to network byte order.
403  *
404  * @param a time to convert
405  * @return converted time value
406  */
407 struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton (struct
408                                                           GNUNET_TIME_Absolute
409                                                           a);
410
411 /**
412  * Convert relative time from network byte order.
413  *
414  * @param a time to convert
415  * @return converted time value
416  */
417 struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh (struct
418                                                        GNUNET_TIME_AbsoluteNBO
419                                                        a);
420
421 /**
422  * Convert a relative time to a string.
423  * NOT reentrant!
424  *
425  * @param time the time to print
426  *
427  * @return string form of the time (as milliseconds)
428  */
429 const char *GNUNET_TIME_relative_to_string (struct GNUNET_TIME_Relative time);
430
431 /**
432  * Set the timestamp offset for this instance.
433  *
434  * @param offset the offset to skew the locale time by
435  */
436 void GNUNET_TIME_set_offset (long long offset);
437
438 #if 0                           /* keep Emacsens' auto-indent happy */
439 {
440 #endif
441 #ifdef __cplusplus
442 }
443 #endif
444
445 /* ifndef GNUNET_TIME_LIB_H */
446 #endif
447 /* end of gnunet_time_lib.h */