modules/up/src/Core/sys/Time.cc
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
1 //
2 // $Id: Time.cc,v 1.1.1.1 2000/03/10 16:32:20 engin Exp $
3 //
4 // system.cc
5 // Author: Ramesh Govindan <govindan@isi.edu>
6 //
7 // Abstracted OS facilities for file system access and
8 // for communication primitives. This file contains implementations of:
9 // - network addresses (Address class)
10 // - OS file descriptors and descriptor sets
11 // - a common time representation
12 //
13
14 #ifdef HAVE_CONFIG_H
15 #include <config.h>
16 #endif
17
18 #include <cstdio>
19 #include <cstdlib>
20 #include <cerrno>
21
22 extern "C" {
23 #if HAVE_UNISTD_H
24 #include <unistd.h>
25 #endif // HAVE_UNISTD_H
26
27 #include <sys/types.h>
28 #include <sys/time.h>
29 #include <sys/resource.h>
30 }
31
32 #include "gnu/MLCG.h"
33 #include "gnu/Uniform.h"
34 #include "util/Types.hh"
35 #include "util/Trail.hh"
36
37 #include "sys/Time.hh"
38 #include "sched/Dispatcher.hh"
39
40 extern "C" {
41 #ifndef STDC_HEADERS
42 extern int gettimeofday(...);
43 #endif // STDC_HEADERS
44 }
45
46 // File local variables
47 static MLCG *mlcg = NULL;
48 static Uniform *uniform = NULL;
49
50 // Time is internally represented in NTP timestamp format,
51 // for convenience. A bit of an overkill, perhaps.
52 // Here, we define two time representations, for time differences
53 // and absolute time.
54 //
55
56 //
57 // The following conversion functions and tables have been adapted
58 // from the xntpd distribution. Their copyrights apply.
59 //
60
61 // Tables to convert from a time stamp fraction to usecs. Note that
62 // the units of these tables are actually (usec<<3). We carry three
63 // guard bits so that the result can be properly truncated (or rounded)
64 // to be correct to the least significant bit.
65 // These tables are rounded.
66
67 static U32 fracToUsecHi[256] = {
68 0x000000, 0x007a12, 0x00f424, 0x016e36,
69 0x01e848, 0x02625a, 0x02dc6c, 0x03567e,
70 0x03d090, 0x044aa2, 0x04c4b4, 0x053ec6,
71 0x05b8d8, 0x0632ea, 0x06acfc, 0x07270e,
72 0x07a120, 0x081b32, 0x089544, 0x090f56,
73 0x098968, 0x0a037a, 0x0a7d8c, 0x0af79e,
74 0x0b71b0, 0x0bebc2, 0x0c65d4, 0x0cdfe6,
75 0x0d59f8, 0x0dd40a, 0x0e4e1c, 0x0ec82e,
76 0x0f4240, 0x0fbc52, 0x103664, 0x10b076,
77 0x112a88, 0x11a49a, 0x121eac, 0x1298be,
78 0x1312d0, 0x138ce2, 0x1406f4, 0x148106,
79 0x14fb18, 0x15752a, 0x15ef3c, 0x16694e,
80 0x16e360, 0x175d72, 0x17d784, 0x185196,
81 0x18cba8, 0x1945ba, 0x19bfcc, 0x1a39de,
82 0x1ab3f0, 0x1b2e02, 0x1ba814, 0x1c2226,
83 0x1c9c38, 0x1d164a, 0x1d905c, 0x1e0a6e,
84 0x1e8480, 0x1efe92, 0x1f78a4, 0x1ff2b6,
85 0x206cc8, 0x20e6da, 0x2160ec, 0x21dafe,
86 0x225510, 0x22cf22, 0x234934, 0x23c346,
87 0x243d58, 0x24b76a, 0x25317c, 0x25ab8e,
88 0x2625a0, 0x269fb2, 0x2719c4, 0x2793d6,
89 0x280de8, 0x2887fa, 0x29020c, 0x297c1e,
90 0x29f630, 0x2a7042, 0x2aea54, 0x2b6466,
91 0x2bde78, 0x2c588a, 0x2cd29c, 0x2d4cae,
92 0x2dc6c0, 0x2e40d2, 0x2ebae4, 0x2f34f6,
93 0x2faf08, 0x30291a, 0x30a32c, 0x311d3e,
94 0x319750, 0x321162, 0x328b74, 0x330586,
95 0x337f98, 0x33f9aa, 0x3473bc, 0x34edce,
96 0x3567e0, 0x35e1f2, 0x365c04, 0x36d616,
97 0x375028, 0x37ca3a, 0x38444c, 0x38be5e,
98 0x393870, 0x39b282, 0x3a2c94, 0x3aa6a6,
99 0x3b20b8, 0x3b9aca, 0x3c14dc, 0x3c8eee,
100 0x3d0900, 0x3d8312, 0x3dfd24, 0x3e7736,
101 0x3ef148, 0x3f6b5a, 0x3fe56c, 0x405f7e,
102 0x40d990, 0x4153a2, 0x41cdb4, 0x4247c6,
103 0x42c1d8, 0x433bea, 0x43b5fc, 0x44300e,
104 0x44aa20, 0x452432, 0x459e44, 0x461856,
105 0x469268, 0x470c7a, 0x47868c, 0x48009e,
106 0x487ab0, 0x48f4c2, 0x496ed4, 0x49e8e6,
107 0x4a62f8, 0x4add0a, 0x4b571c, 0x4bd12e,
108 0x4c4b40, 0x4cc552, 0x4d3f64, 0x4db976,
109 0x4e3388, 0x4ead9a, 0x4f27ac, 0x4fa1be,
110 0x501bd0, 0x5095e2, 0x510ff4, 0x518a06,
111 0x520418, 0x527e2a, 0x52f83c, 0x53724e,
112 0x53ec60, 0x546672, 0x54e084, 0x555a96,
113 0x55d4a8, 0x564eba, 0x56c8cc, 0x5742de,
114 0x57bcf0, 0x583702, 0x58b114, 0x592b26,
115 0x59a538, 0x5a1f4a, 0x5a995c, 0x5b136e,
116 0x5b8d80, 0x5c0792, 0x5c81a4, 0x5cfbb6,
117 0x5d75c8, 0x5defda, 0x5e69ec, 0x5ee3fe,
118 0x5f5e10, 0x5fd822, 0x605234, 0x60cc46,
119 0x614658, 0x61c06a, 0x623a7c, 0x62b48e,
120 0x632ea0, 0x63a8b2, 0x6422c4, 0x649cd6,
121 0x6516e8, 0x6590fa, 0x660b0c, 0x66851e,
122 0x66ff30, 0x677942, 0x67f354, 0x686d66,
123 0x68e778, 0x69618a, 0x69db9c, 0x6a55ae,
124 0x6acfc0, 0x6b49d2, 0x6bc3e4, 0x6c3df6,
125 0x6cb808, 0x6d321a, 0x6dac2c, 0x6e263e,
126 0x6ea050, 0x6f1a62, 0x6f9474, 0x700e86,
127 0x708898, 0x7102aa, 0x717cbc, 0x71f6ce,
128 0x7270e0, 0x72eaf2, 0x736504, 0x73df16,
129 0x745928, 0x74d33a, 0x754d4c, 0x75c75e,
130 0x764170, 0x76bb82, 0x773594, 0x77afa6,
131 0x7829b8, 0x78a3ca, 0x791ddc, 0x7997ee
132 };
133
134 static U32 fracToUsecMid[256] = {
135 0x0000, 0x007a, 0x00f4, 0x016e, 0x01e8, 0x0262, 0x02dc, 0x0356,
136 0x03d1, 0x044b, 0x04c5, 0x053f, 0x05b9, 0x0633, 0x06ad, 0x0727,
137 0x07a1, 0x081b, 0x0895, 0x090f, 0x0989, 0x0a03, 0x0a7e, 0x0af8,
138 0x0b72, 0x0bec, 0x0c66, 0x0ce0, 0x0d5a, 0x0dd4, 0x0e4e, 0x0ec8,
139 0x0f42, 0x0fbc, 0x1036, 0x10b0, 0x112b, 0x11a5, 0x121f, 0x1299,
140 0x1313, 0x138d, 0x1407, 0x1481, 0x14fb, 0x1575, 0x15ef, 0x1669,
141 0x16e3, 0x175d, 0x17d8, 0x1852, 0x18cc, 0x1946, 0x19c0, 0x1a3a,
142 0x1ab4, 0x1b2e, 0x1ba8, 0x1c22, 0x1c9c, 0x1d16, 0x1d90, 0x1e0a,
143 0x1e84, 0x1eff, 0x1f79, 0x1ff3, 0x206d, 0x20e7, 0x2161, 0x21db,
144 0x2255, 0x22cf, 0x2349, 0x23c3, 0x243d, 0x24b7, 0x2531, 0x25ac,
145 0x2626, 0x26a0, 0x271a, 0x2794, 0x280e, 0x2888, 0x2902, 0x297c,
146 0x29f6, 0x2a70, 0x2aea, 0x2b64, 0x2bde, 0x2c59, 0x2cd3, 0x2d4d,
147 0x2dc7, 0x2e41, 0x2ebb, 0x2f35, 0x2faf, 0x3029, 0x30a3, 0x311d,
148 0x3197, 0x3211, 0x328b, 0x3306, 0x3380, 0x33fa, 0x3474, 0x34ee,
149 0x3568, 0x35e2, 0x365c, 0x36d6, 0x3750, 0x37ca, 0x3844, 0x38be,
150 0x3938, 0x39b3, 0x3a2d, 0x3aa7, 0x3b21, 0x3b9b, 0x3c15, 0x3c8f,
151 0x3d09, 0x3d83, 0x3dfd, 0x3e77, 0x3ef1, 0x3f6b, 0x3fe5, 0x405f,
152 0x40da, 0x4154, 0x41ce, 0x4248, 0x42c2, 0x433c, 0x43b6, 0x4430,
153 0x44aa, 0x4524, 0x459e, 0x4618, 0x4692, 0x470c, 0x4787, 0x4801,
154 0x487b, 0x48f5, 0x496f, 0x49e9, 0x4a63, 0x4add, 0x4b57, 0x4bd1,
155 0x4c4b, 0x4cc5, 0x4d3f, 0x4db9, 0x4e34, 0x4eae, 0x4f28, 0x4fa2,
156 0x501c, 0x5096, 0x5110, 0x518a, 0x5204, 0x527e, 0x52f8, 0x5372,
157 0x53ec, 0x5466, 0x54e1, 0x555b, 0x55d5, 0x564f, 0x56c9, 0x5743,
158 0x57bd, 0x5837, 0x58b1, 0x592b, 0x59a5, 0x5a1f, 0x5a99, 0x5b13,
159 0x5b8d, 0x5c08, 0x5c82, 0x5cfc, 0x5d76, 0x5df0, 0x5e6a, 0x5ee4,
160 0x5f5e, 0x5fd8, 0x6052, 0x60cc, 0x6146, 0x61c0, 0x623a, 0x62b5,
161 0x632f, 0x63a9, 0x6423, 0x649d, 0x6517, 0x6591, 0x660b, 0x6685,
162 0x66ff, 0x6779, 0x67f3, 0x686d, 0x68e7, 0x6962, 0x69dc, 0x6a56,
163 0x6ad0, 0x6b4a, 0x6bc4, 0x6c3e, 0x6cb8, 0x6d32, 0x6dac, 0x6e26,
164 0x6ea0, 0x6f1a, 0x6f94, 0x700f, 0x7089, 0x7103, 0x717d, 0x71f7,
165 0x7271, 0x72eb, 0x7365, 0x73df, 0x7459, 0x74d3, 0x754d, 0x75c7,
166 0x7641, 0x76bc, 0x7736, 0x77b0, 0x782a, 0x78a4, 0x791e, 0x7998
167 };
168
169 static U32 fracToUsecLo[128] = {
170 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
171 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
172 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
173 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e,
174 0x1f, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
175 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
176 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x33, 0x34,
177 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
178 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44,
179 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
180 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
181 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b,
182 0x5c, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62,
183 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
184 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x71,
185 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79
186 };
187
188 // Tables to calculate time stamp fractions from usecs. The entries
189 // in these tables are offset into using each of the two low order
190 // bytes plus the next 4 bits in a usec value (from a struct timeval).
191 // These are summed to produce the time stamp fraction.
192
193 // Note that these tables are rounded (not truncated) to the nearest
194 // low order bit in the fraction. The timestamp computed should be
195 // +- 1.5 low order bits.
196
197 static U32 usecToFracLo[256] = {
198 0x00000000, 0x000010c7, 0x0000218e, 0x00003255,
199 0x0000431c, 0x000053e3, 0x000064aa, 0x00007571,
200 0x00008638, 0x000096ff, 0x0000a7c6, 0x0000b88d,
201 0x0000c954, 0x0000da1b, 0x0000eae2, 0x0000fba9,
202 0x00010c6f, 0x00011d36, 0x00012dfd, 0x00013ec4,
203 0x00014f8b, 0x00016052, 0x00017119, 0x000181e0,
204 0x000192a7, 0x0001a36e, 0x0001b435, 0x0001c4fc,
205 0x0001d5c3, 0x0001e68a, 0x0001f751, 0x00020818,
206 0x000218df, 0x000229a6, 0x00023a6d, 0x00024b34,
207 0x00025bfb, 0x00026cc2, 0x00027d89, 0x00028e50,
208 0x00029f17, 0x0002afde, 0x0002c0a5, 0x0002d16c,
209 0x0002e233, 0x0002f2fa, 0x000303c0, 0x00031487,
210 0x0003254e, 0x00033615, 0x000346dc, 0x000357a3,
211 0x0003686a, 0x00037931, 0x000389f8, 0x00039abf,
212 0x0003ab86, 0x0003bc4d, 0x0003cd14, 0x0003dddb,
213 0x0003eea2, 0x0003ff69, 0x00041030, 0x000420f7,
214 0x000431be, 0x00044285, 0x0004534c, 0x00046413,
215 0x000474da, 0x000485a1, 0x00049668, 0x0004a72f,
216 0x0004b7f6, 0x0004c8bd, 0x0004d984, 0x0004ea4b,
217 0x0004fb12, 0x00050bd8, 0x00051c9f, 0x00052d66,
218 0x00053e2d, 0x00054ef4, 0x00055fbb, 0x00057082,
219 0x00058149, 0x00059210, 0x0005a2d7, 0x0005b39e,
220 0x0005c465, 0x0005d52c, 0x0005e5f3, 0x0005f6ba,
221 0x00060781, 0x00061848, 0x0006290f, 0x000639d6,
222 0x00064a9d, 0x00065b64, 0x00066c2b, 0x00067cf2,
223 0x00068db9, 0x00069e80, 0x0006af47, 0x0006c00e,
224 0x0006d0d5, 0x0006e19c, 0x0006f263, 0x00070329,
225 0x000713f0, 0x000724b7, 0x0007357e, 0x00074645,
226 0x0007570c, 0x000767d3, 0x0007789a, 0x00078961,
227 0x00079a28, 0x0007aaef, 0x0007bbb6, 0x0007cc7d,
228 0x0007dd44, 0x0007ee0b, 0x0007fed2, 0x00080f99,
229 0x00082060, 0x00083127, 0x000841ee, 0x000852b5,
230 0x0008637c, 0x00087443, 0x0008850a, 0x000895d1,
231 0x0008a698, 0x0008b75f, 0x0008c826, 0x0008d8ed,
232 0x0008e9b4, 0x0008fa7b, 0x00090b41, 0x00091c08,
233 0x00092ccf, 0x00093d96, 0x00094e5d, 0x00095f24,
234 0x00096feb, 0x000980b2, 0x00099179, 0x0009a240,
235 0x0009b307, 0x0009c3ce, 0x0009d495, 0x0009e55c,
236 0x0009f623, 0x000a06ea, 0x000a17b1, 0x000a2878,
237 0x000a393f, 0x000a4a06, 0x000a5acd, 0x000a6b94,
238 0x000a7c5b, 0x000a8d22, 0x000a9de9, 0x000aaeb0,
239 0x000abf77, 0x000ad03e, 0x000ae105, 0x000af1cc,
240 0x000b0292, 0x000b1359, 0x000b2420, 0x000b34e7,
241 0x000b45ae, 0x000b5675, 0x000b673c, 0x000b7803,
242 0x000b88ca, 0x000b9991, 0x000baa58, 0x000bbb1f,
243 0x000bcbe6, 0x000bdcad, 0x000bed74, 0x000bfe3b,
244 0x000c0f02, 0x000c1fc9, 0x000c3090, 0x000c4157,
245 0x000c521e, 0x000c62e5, 0x000c73ac, 0x000c8473,
246 0x000c953a, 0x000ca601, 0x000cb6c8, 0x000cc78f,
247 0x000cd856, 0x000ce91d, 0x000cf9e4, 0x000d0aaa,
248 0x000d1b71, 0x000d2c38, 0x000d3cff, 0x000d4dc6,
249 0x000d5e8d, 0x000d6f54, 0x000d801b, 0x000d90e2,
250 0x000da1a9, 0x000db270, 0x000dc337, 0x000dd3fe,
251 0x000de4c5, 0x000df58c, 0x000e0653, 0x000e171a,
252 0x000e27e1, 0x000e38a8, 0x000e496f, 0x000e5a36,
253 0x000e6afd, 0x000e7bc4, 0x000e8c8b, 0x000e9d52,
254 0x000eae19, 0x000ebee0, 0x000ecfa7, 0x000ee06e,
255 0x000ef135, 0x000f01fb, 0x000f12c2, 0x000f2389,
256 0x000f3450, 0x000f4517, 0x000f55de, 0x000f66a5,
257 0x000f776c, 0x000f8833, 0x000f98fa, 0x000fa9c1,
258 0x000fba88, 0x000fcb4f, 0x000fdc16, 0x000fecdd,
259 0x000ffda4, 0x00100e6b, 0x00101f32, 0x00102ff9,
260 0x001040c0, 0x00105187, 0x0010624e, 0x00107315,
261 0x001083dc, 0x001094a3, 0x0010a56a, 0x0010b631,
262 };
263
264 static U32 usecToFracMid[256] = {
265 0x00000000, 0x0010c6f8, 0x00218def, 0x003254e7,
266 0x00431bde, 0x0053e2d6, 0x0064a9ce, 0x007570c5,
267 0x008637bd, 0x0096feb4, 0x00a7c5ac, 0x00b88ca4,
268 0x00c9539b, 0x00da1a93, 0x00eae18a, 0x00fba882,
269 0x010c6f7a, 0x011d3671, 0x012dfd69, 0x013ec460,
270 0x014f8b58, 0x01605250, 0x01711947, 0x0181e03f,
271 0x0192a736, 0x01a36e2e, 0x01b43526, 0x01c4fc1d,
272 0x01d5c315, 0x01e68a0c, 0x01f75104, 0x020817fc,
273 0x0218def3, 0x0229a5eb, 0x023a6ce3, 0x024b33da,
274 0x025bfad2, 0x026cc1c9, 0x027d88c1, 0x028e4fb9,
275 0x029f16b0, 0x02afdda8, 0x02c0a49f, 0x02d16b97,
276 0x02e2328f, 0x02f2f986, 0x0303c07e, 0x03148775,
277 0x03254e6d, 0x03361565, 0x0346dc5c, 0x0357a354,
278 0x03686a4b, 0x03793143, 0x0389f83b, 0x039abf32,
279 0x03ab862a, 0x03bc4d21, 0x03cd1419, 0x03dddb11,
280 0x03eea208, 0x03ff6900, 0x04102ff7, 0x0420f6ef,
281 0x0431bde7, 0x044284de, 0x04534bd6, 0x046412cd,
282 0x0474d9c5, 0x0485a0bd, 0x049667b4, 0x04a72eac,
283 0x04b7f5a3, 0x04c8bc9b, 0x04d98393, 0x04ea4a8a,
284 0x04fb1182, 0x050bd879, 0x051c9f71, 0x052d6669,
285 0x053e2d60, 0x054ef458, 0x055fbb4f, 0x05708247,
286 0x0581493f, 0x05921036, 0x05a2d72e, 0x05b39e25,
287 0x05c4651d, 0x05d52c15, 0x05e5f30c, 0x05f6ba04,
288 0x060780fb, 0x061847f3, 0x06290eeb, 0x0639d5e2,
289 0x064a9cda, 0x065b63d2, 0x066c2ac9, 0x067cf1c1,
290 0x068db8b8, 0x069e7fb0, 0x06af46a8, 0x06c00d9f,
291 0x06d0d497, 0x06e19b8e, 0x06f26286, 0x0703297e,
292 0x0713f075, 0x0724b76d, 0x07357e64, 0x0746455c,
293 0x07570c54, 0x0767d34b, 0x07789a43, 0x0789613a,
294 0x079a2832, 0x07aaef2a, 0x07bbb621, 0x07cc7d19,
295 0x07dd4410, 0x07ee0b08, 0x07fed200, 0x080f98f7,
296 0x08205fef, 0x083126e6, 0x0841edde, 0x0852b4d6,
297 0x08637bcd, 0x087442c5, 0x088509bc, 0x0895d0b4,
298 0x08a697ac, 0x08b75ea3, 0x08c8259b, 0x08d8ec92,
299 0x08e9b38a, 0x08fa7a82, 0x090b4179, 0x091c0871,
300 0x092ccf68, 0x093d9660, 0x094e5d58, 0x095f244f,
301 0x096feb47, 0x0980b23e, 0x09917936, 0x09a2402e,
302 0x09b30725, 0x09c3ce1d, 0x09d49514, 0x09e55c0c,
303 0x09f62304, 0x0a06e9fb, 0x0a17b0f3, 0x0a2877ea,
304 0x0a393ee2, 0x0a4a05da, 0x0a5accd1, 0x0a6b93c9,
305 0x0a7c5ac1, 0x0a8d21b8, 0x0a9de8b0, 0x0aaeafa7,
306 0x0abf769f, 0x0ad03d97, 0x0ae1048e, 0x0af1cb86,
307 0x0b02927d, 0x0b135975, 0x0b24206d, 0x0b34e764,
308 0x0b45ae5c, 0x0b567553, 0x0b673c4b, 0x0b780343,
309 0x0b88ca3a, 0x0b999132, 0x0baa5829, 0x0bbb1f21,
310 0x0bcbe619, 0x0bdcad10, 0x0bed7408, 0x0bfe3aff,
311 0x0c0f01f7, 0x0c1fc8ef, 0x0c308fe6, 0x0c4156de,
312 0x0c521dd5, 0x0c62e4cd, 0x0c73abc5, 0x0c8472bc,
313 0x0c9539b4, 0x0ca600ab, 0x0cb6c7a3, 0x0cc78e9b,
314 0x0cd85592, 0x0ce91c8a, 0x0cf9e381, 0x0d0aaa79,
315 0x0d1b7171, 0x0d2c3868, 0x0d3cff60, 0x0d4dc657,
316 0x0d5e8d4f, 0x0d6f5447, 0x0d801b3e, 0x0d90e236,
317 0x0da1a92d, 0x0db27025, 0x0dc3371d, 0x0dd3fe14,
318 0x0de4c50c, 0x0df58c03, 0x0e0652fb, 0x0e1719f3,
319 0x0e27e0ea, 0x0e38a7e2, 0x0e496ed9, 0x0e5a35d1,
320 0x0e6afcc9, 0x0e7bc3c0, 0x0e8c8ab8, 0x0e9d51b0,
321 0x0eae18a7, 0x0ebedf9f, 0x0ecfa696, 0x0ee06d8e,
322 0x0ef13486, 0x0f01fb7d, 0x0f12c275, 0x0f23896c,
323 0x0f345064, 0x0f45175c, 0x0f55de53, 0x0f66a54b,
324 0x0f776c42, 0x0f88333a, 0x0f98fa32, 0x0fa9c129,
325 0x0fba8821, 0x0fcb4f18, 0x0fdc1610, 0x0fecdd08,
326 0x0ffda3ff, 0x100e6af7, 0x101f31ee, 0x102ff8e6,
327 0x1040bfde, 0x105186d5, 0x10624dcd, 0x107314c4,
328 0x1083dbbc, 0x1094a2b4, 0x10a569ab, 0x10b630a3,
329 };
330
331 static U32 usecToFracHi[16] = {
332 0x00000000, 0x10c6f79a, 0x218def35, 0x3254e6cf,
333 0x431bde6a, 0x53e2d604, 0x64a9cd9f, 0x7570c539,
334 0x8637bcd3, 0x96feb46e, 0xa7c5ac08, 0xb88ca3a3,
335 0xc9539b3d, 0xda1a92d7, 0xeae18a72, 0xfba8820c,
336 };
337
338 TimeShort::TimeShort()
339 {
340 time = 0;
341 }
342
343 TimeShort::TimeShort(U32 t)
344 {
345 time = t;
346 }
347
348 TimeShort::TimeShort(U16 i, U16 f)
349 {
350 time = i;
351 time <<= 16;
352 time |= f;
353 }
354
355 U16
356 TimeShort::seconds()
357 {
358 return (U16) (time >> 16);
359 }
360
361 U16
362 TimeShort::fraction()
363 {
364 return (U16) (time & 0xffff);
365 }
366
367 void
368 TimeShort::set(U16 i, U16 f)
369 {
370 time = i;
371 time <<= 16;
372 time |= f;
373 }
374
375 void
376 TimeShort::set(U32 usecs)
377 {
378 U64 t;
379
380 t = (U64) ((usecs) / 1000000);
381 t <<= 32;
382 usecs = usecs % 1000000;
383 t += (U64) (usecToFracLo[usecs & 0xff]
384 + usecToFracMid[(usecs >> 8) & 0xff]
385 + usecToFracHi[(usecs >> 16) & 0xf]);
386 time = (U32) ((t >> 16) & 0xffffffff);
387 }
388
389 TimeLong
390 TimeShort::lengthen()
391 {
392 U64 t;
393
394 t = time;
395 t <<= 16;
396
397 return TimeLong(t);
398 }
399
400 void
401 TimeShort::randomize()
402 {
403 if (uniform == NULL) {
404 mlcg = new MLCG(dispatcher.systemClock.seconds(),
405 dispatcher.systemClock.fraction());
406 uniform = new Uniform(0, 1, mlcg);
407 }
408 time = (int) ((*uniform)() * (double) time);
409 }
410
411 U32
412 TimeShort::usecs()
413 {
414 U32 t;
415 U32 f;
416
417 t = seconds() * 1000000;
418 f = fraction() << 16;
419 t += (fracToUsecHi[(f >> 24) & 0xff]
420 + fracToUsecMid[(f >> 16) & 0xff]
421 + fracToUsecLo[(f >> 9) & 0x7f]
422 + 0x4) >> 3;
423 return t;
424 }
425
426 U32
427 TimeShort::get() const
428 {
429 return time;
430 }
431
432 TimeLong::TimeLong()
433 {
434 time = 0; // Uninitialized timer
435 }
436
437 TimeLong::TimeLong(U64 t)
438 {
439 time = t;
440 }
441
442 TimeLong::TimeLong(U32 i, U32 f)
443 {
444 time = i;
445 time <<= 32;
446 time |= f;
447 }
448
449 TimeShort
450 TimeLong::operator-(TimeLong y)
451 {
452 U64 t;
453
454 t = (time > y.time) ? (time - y.time) : 0;
455 return TimeShort((U16) ((t >> 32) & 0xffff),
456 (U16) ((t >> 16) & 0xffff));
457 }
458
459 TimeLong
460 TimeLong::operator+(TimeShort y)
461 {
462 U64 t;
463
464 t = y.time;
465 t <<= 16;
466 return TimeLong(time + t);
467 }
468
469 void
470 TimeLong::sync()
471 {
472 U32 seconds;
473 U32 fraction;
474 struct timeval tv;
475
476 (void) gettimeofday(&tv, NULL);
477 seconds = tv.tv_sec;
478 fraction = usecToFracLo[tv.tv_usec & 0xff]
479 + usecToFracMid[(tv.tv_usec >> 8) & 0xff]
480 + usecToFracHi[(tv.tv_usec >> 16) & 0xf];
481
482 time = seconds;
483 time <<= 32;
484 time += fraction;
485 }
486
487 U32
488 TimeLong::seconds()
489 {
490 return (time >> 32) & 0xffffffff;
491 }
492
493 U32
494 TimeLong::fraction()
495 {
496 return time & 0xffffffff;
497 }
498
499 U64
500 TimeLong::get() const
501 {
502 return time;
503 }
504
505 void
506 TimeLong::set(U32 secs,
507 U32 frac)
508 {
509 time = secs;
510 time <<= 32;
511 time += frac;
512 }
513
514 void
515 TimeLong::systemTime(struct timeval *tv)
516 {
517 tv->tv_sec = seconds();
518 tv->tv_usec = (fracToUsecHi[(fraction() >> 24) & 0xff]
519 + fracToUsecMid[(fraction() >> 16) & 0xff]
520 + fracToUsecLo[(fraction() >> 9) & 0x7f]
521 + 0x4) >> 3;
522 }
523
524 //
525 // Copyright (c) 1994 by the University of Southern California.
526 // All rights reserved.
527 //
528 // Permission to use, copy, modify, and distribute this software and
529 // its documentation in source and binary forms for lawful
530 // non-commercial purposes and without fee is hereby granted, provided
531 // that the above copyright notice appear in all copies and that both
532 // the copyright notice and this permission notice appear in supporting
533 // documentation, and that any documentation, advertising materials,
534 // and other materials related to such distribution and use acknowledge
535 // that the software was developed by the University of Southern
536 // California and/or Information Sciences Institute.
537 // The name of the University of Southern California may not
538 // be used to endorse or promote products derived from this software
539 // without specific prior written permission.
540 //
541 // THE UNIVERSITY OF SOUTHERN CALIFORNIA DOES NOT MAKE ANY REPRESENTATIONS
542 // ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE. THIS SOFTWARE IS
543 // PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
544 // INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
545 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND
546 // NON-INFRINGEMENT.
547 //
548 // IN NO EVENT SHALL USC, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
549 // SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT,
550 // TORT, OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH,
551 // THE USE OR PERFORMANCE OF THIS SOFTWARE.
552 //
553 // Questions concerning this software should be directed to
554 // info-ra@isi.edu.
555 //