Rename "subsystems" directory to "base"
[oonf.git] / src / base / oonf_clock.c
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon version 2 (olsrd2)
4  * Copyright (c) 2004-2015, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 /**
43  * @file
44  */
45
46 #include <ctype.h>
47 #include <errno.h>
48 #include <stdio.h>
49 #include <time.h>
50
51 #include <oonf/oonf.h>
52 #include <oonf/libcommon/isonumber.h>
53
54 #include <oonf/libconfig/cfg.h>
55 #include <oonf/libconfig/cfg_schema.h>
56
57 #include <oonf/libcore/oonf_logging.h>
58 #include <oonf/libcore/oonf_subsystem.h>
59 #include <oonf/base/os_clock.h>
60
61 #include <oonf/base/oonf_clock.h>
62
63 /* definitions */
64 #define LOG_CLOCK _oonf_clock_subsystem.logging
65
66 /* prototypes */
67 static int _init(void);
68
69 /* absolute monotonic clock measured in milliseconds compared to start time */
70 static uint64_t now_times;
71
72 /* arbitrary timestamp that represents the time oonf_clock_init() was called */
73 static uint64_t start_time;
74
75 /* subsystem definition */
76 static const char *_dependencies[] = {
77   OONF_OS_CLOCK_SUBSYSTEM,
78 };
79
80 static struct oonf_subsystem _oonf_clock_subsystem = {
81   .name = OONF_CLOCK_SUBSYSTEM,
82   .dependencies = _dependencies,
83   .dependencies_count = ARRAYSIZE(_dependencies),
84   .init = _init,
85 };
86 DECLARE_OONF_PLUGIN(_oonf_clock_subsystem);
87
88 /**
89  * Initialize olsr clock system
90  * @return -1 if an error happened, 0 otherwise
91  */
92 static int
93 _init(void) {
94   if (os_clock_gettime64(&start_time)) {
95     OONF_WARN(LOG_CLOCK, "OS clock is not working: %s (%d)\n", strerror(errno), errno);
96     return -1;
97   }
98
99   now_times = 0;
100
101   return 0;
102 }
103
104 /**
105  * Update the internal clock to current system time
106  * @return -1 if an error happened, 0 otherwise
107  */
108 int
109 oonf_clock_update(void) {
110   uint64_t now;
111   if (os_clock_gettime64(&now)) {
112     OONF_WARN(LOG_CLOCK, "OS clock is not working: %s (%d)\n", strerror(errno), errno);
113     return -1;
114   }
115
116   now_times = now - start_time;
117   return 0;
118 }
119
120 /**
121  * Calculates the current time in the internal OONF representation
122  * @return current time
123  */
124 uint64_t
125 oonf_clock_getNow(void) {
126   return now_times;
127 }
128
129 /**
130  * Format an internal time value into a string.
131  * Displays hours:minutes:seconds.millisecond.
132  *
133  * @param buf string buffer for creating output
134  * @param clk OONF timestamp
135  * @return buffer to a formatted system time string.
136  */
137 const char *
138 oonf_clock_toClockString(struct isonumber_str *buf, uint64_t clk) {
139   uint64_t msec = clk % MSEC_PER_SEC;
140   uint64_t sec = clk / MSEC_PER_SEC;
141
142   snprintf(buf->buf, sizeof(*buf), "%" PRIu64 ":%02" PRIu64 ":%02" PRIu64 ".%03" PRIu64 "", sec / 3600,
143     (sec % 3600) / 60, (sec % 60), msec);
144
145   return buf->buf;
146 }