5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2007 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.
24 void silc_timer_start(SilcTimer timer)
26 struct timeval curtime;
28 memset(timer, 0, sizeof(timer));
30 silc_gettimeofday(&curtime);
31 timer->start_sec = curtime.tv_sec;
32 timer->start_usec = curtime.tv_usec;
34 timer->running = TRUE;
39 void silc_timer_stop(SilcTimer timer)
41 struct timeval curtime;
43 silc_gettimeofday(&curtime);
45 if (curtime.tv_usec < timer->start_usec) {
47 curtime.tv_usec += 1000000L;
49 timer->timer_sec = curtime.tv_sec - timer->start_sec;
50 timer->timer_usec = curtime.tv_usec - timer->start_usec;
52 timer->running = FALSE;
55 /* Continue stopped timer */
57 void silc_timer_continue(SilcTimer timer)
59 struct timeval curtime;
64 silc_gettimeofday(&curtime);
66 if (curtime.tv_usec < timer->timer_usec) {
68 curtime.tv_usec += 1000000L;
70 timer->start_sec = curtime.tv_sec - timer->timer_sec;
71 timer->start_usec = curtime.tv_usec - timer->timer_usec;
73 timer->running = TRUE;
76 /* Return timer value */
78 void silc_timer_value(SilcTimer timer,
79 SilcUInt64 *elapsed_time_seconds,
80 SilcUInt32 *elapsed_time_microseconds)
83 struct timeval curtime;
85 silc_gettimeofday(&curtime);
87 if (curtime.tv_usec < timer->start_usec) {
89 curtime.tv_usec += 1000000L;
91 timer->timer_sec = curtime.tv_sec - timer->start_sec;
92 timer->timer_usec = curtime.tv_usec - timer->start_usec;
95 if (elapsed_time_seconds)
96 *elapsed_time_seconds = timer->timer_sec;
97 if (elapsed_time_microseconds)
98 *elapsed_time_microseconds = timer->timer_usec;
101 /* Return timer value */
103 void silc_timer_value_time(SilcTimer timer, SilcTime ret_time)
108 silc_timer_value(timer, &sec, &usec);
109 sec = ((timer->start_sec + sec) * (SilcUInt64)1000);
110 sec += ((timer->start_usec + usec) / 1000);
111 silc_time_value(sec, ret_time);
114 /* Return start time */
116 void silc_timer_start_time(SilcTimer timer, SilcTime ret_start_time)
118 silc_time_value(((timer->start_sec * (SilcUInt64)1000) +
119 (timer->start_usec / 1000)), ret_start_time);
122 /* Return TRUE if timer is running */
124 SilcBool silc_timer_is_running(SilcTimer timer)
126 return timer->running;