5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2007 - 2008 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
20 #include "silcruntime.h"
24 void silc_timer_start(SilcTimer timer)
26 struct timeval curtime;
28 silc_gettimeofday(&curtime);
29 timer->start_sec = curtime.tv_sec;
30 timer->start_usec = curtime.tv_usec;
32 timer->timer_usec = 0;
34 timer->sync_tdiff = 0;
35 timer->running = TRUE;
40 void silc_timer_stop(SilcTimer timer)
42 struct timeval curtime;
44 silc_gettimeofday(&curtime);
46 if (curtime.tv_usec < timer->start_usec) {
48 curtime.tv_usec += 1000000L;
50 timer->timer_sec = curtime.tv_sec - timer->start_sec;
51 timer->timer_usec = curtime.tv_usec - timer->start_usec;
52 timer->timer_usec -= timer->sync_diff;
54 timer->running = FALSE;
57 /* Continue stopped timer */
59 void silc_timer_continue(SilcTimer timer)
61 struct timeval curtime;
66 silc_gettimeofday(&curtime);
68 if (curtime.tv_usec < timer->timer_usec) {
70 curtime.tv_usec += 1000000L;
72 timer->start_sec = curtime.tv_sec - timer->timer_sec;
73 timer->start_usec = curtime.tv_usec - timer->timer_usec;
75 timer->running = TRUE;
78 /* Return timer value */
80 void silc_timer_value(SilcTimer timer,
81 SilcUInt64 *elapsed_time_seconds,
82 SilcUInt32 *elapsed_time_microseconds)
85 struct timeval curtime;
87 silc_gettimeofday(&curtime);
89 if (curtime.tv_usec < timer->start_usec) {
91 curtime.tv_usec += 1000000L;
93 timer->timer_sec = curtime.tv_sec - timer->start_sec;
94 timer->timer_usec = curtime.tv_usec - timer->start_usec;
95 timer->timer_usec -= timer->sync_diff;
98 if (elapsed_time_seconds)
99 *elapsed_time_seconds = timer->timer_sec;
100 if (elapsed_time_microseconds)
101 *elapsed_time_microseconds = timer->timer_usec;
104 /* Return timer value */
106 void silc_timer_value_time(SilcTimer timer, SilcTime ret_time)
111 silc_timer_value(timer, &sec, &usec);
112 sec = ((timer->start_sec + sec) * (SilcUInt64)1000);
113 sec += ((timer->start_usec + usec) / 1000);
114 silc_time_value(sec, ret_time);
117 /* Return start time */
119 void silc_timer_start_time(SilcTimer timer, SilcTime ret_start_time)
121 silc_time_value(((timer->start_sec * (SilcUInt64)1000) +
122 (timer->start_usec / 1000)), ret_start_time);
125 /* Return TRUE if timer is running */
127 SilcBool silc_timer_is_running(SilcTimer timer)
129 return timer->running;