oodatetime.c

来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 176 行

C
176
字号
/* * Copyright (C) 2004-2005 by Objective Systems, Inc. * * This software is furnished under an open source license and may be  * used and copied only in accordance with the terms of this license.  * The text of the license may generally be found in the root  * directory of this installation in the LICENSE.txt file.  It  * can also be viewed online at the following URL: * *   http://www.obj-sys.com/open/license.html * * Any redistributions of this file including modified versions must  * maintain this copyright notice. * *****************************************************************************/#include "ooCommon.h"#if defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__)#ifndef __MINGW32__#include <SYS\TIMEB.H>int gettimeofday (struct timeval *tv, struct timezone *tz){   struct _timeb currSysTime;   _ftime(&currSysTime);	   tv->tv_sec = currSysTime.time;   tv->tv_usec = currSysTime.millitm * 1000;   return 0;}#else/* Mingw specific logic..probably works with regular winders * too, but cannot test. --Ben */#define uint64 unsigned long long#define uint32 unsigned longstatic uint64 calcEpocOffset() {   SYSTEMTIME st;   FILETIME ft;   memset(&st, 0, sizeof(st));   memset(&ft, 0, sizeof(ft));   st.wYear = 1970;   st.wMonth = 1;   st.wDayOfWeek = 0;   st.wDay = 1;   st.wHour = 0;   st.wMinute = 0;   st.wSecond = 0;   st.wMilliseconds = 0;   if (!SystemTimeToFileTime(&st, &ft)) {      //cout << "ERROR:  SystemTimeToFileTime failed, err: "      //       << GetLastError() << endl;   }   uint64 t = ft.dwHighDateTime;   t = t << 32;   t |= ft.dwLowDateTime;   return t;}// Gets high resolution by spinning up to 15ms.  Don't call this often!!!static uint64 getRawCurMsSpin() {   FILETIME tm;      uint64 t_now;   static uint64 epocOffset = 0;   static int do_once = 1;   if (do_once) {      epocOffset = calcEpocOffset();      do_once = 0;   }   GetSystemTimeAsFileTime(&tm);   uint64 t_start = tm.dwHighDateTime;   t_start = t_start << 32;   t_start |= tm.dwLowDateTime;   while (1) {      GetSystemTimeAsFileTime(&tm);      t_now = tm.dwHighDateTime;      t_now = t_now << 32;      t_now |= tm.dwLowDateTime;      if (t_now != t_start) {         // Hit a boundary...as accurate as we are going to get.         break;      }   }   t_now -= epocOffset;   // t is in 100ns units, convert to usecs   t_now = t_now / 10000; //msecs   return t_now;}static uint64 baselineMs = 0;static uint32 tickBaseline = 0;int gettimeofday(struct timeval* tv, void* null) {   // Get baseline time, in seconds.   if (baselineMs == 0) {      baselineMs = getRawCurMsSpin();      tickBaseline = timeGetTime();   }   uint32 curTicks = timeGetTime();   if (curTicks < tickBaseline) {      // Wrap!      baselineMs = getRawCurMsSpin();      tickBaseline = timeGetTime();   }      uint64 now_ms = (baselineMs + (curTicks - tickBaseline));   *tv = oo_ms_to_tv(now_ms);   return 0;};/* Correctly synched with the 'real' time/date clock, but only exact to * about 15ms.  Set foo to non NULL if you want to recalculate the */uint64 getCurMsFromClock() {   // This has resolution of only about 15ms   FILETIME tm;   // The Windows epoc is January 1, 1601 (UTC).   static uint64 offset = 0;   static int do_once = 1;   if (do_once) {      offset = calcEpocOffset();      do_once = 0;   }   GetSystemTimeAsFileTime(&tm);   uint64 t = tm.dwHighDateTime;   t = t << 32;   t |= tm.dwLowDateTime;   /*cout << "file-time: " << t << " offset: " << offset          << " normalized: " << (t - offset) << " hi: "          << tm.dwHighDateTime << " lo: " << tm.dwLowDateTime          << " calc-offset:\n" << calcEpocOffset() << "\n\n";   */   t -= offset;   // t is in 100ns units, convert to ms   t = t / 10000;   return t;}#endif#endifint ooGetTimeOfDay (struct timeval *tv, struct timezone *tz){   return gettimeofday (tv, tz);}long ooGetTimeDiff(struct timeval *tv1, struct timeval *tv2){   return ( ((tv2->tv_sec-tv1->tv_sec)*1000) +             ((tv2->tv_usec-tv1->tv_usec)/1000) );}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?