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 //

/* [<][>][^][v][top][bottom][index][help] */