my_getsystime.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* get time since epoc in 100 nanosec units */
  14. /* thus to get the current time we should use the system function
  15.    with the highest possible resolution */
  16. #ifdef __NETWARE__
  17. #include <nks/time.h>
  18. #endif
  19. #include "mysys_priv.h"
  20. ulonglong my_getsystime()
  21. {
  22. #ifdef HAVE_CLOCK_GETTIME
  23.   struct timespec tp;
  24.   clock_gettime(CLOCK_REALTIME, &tp);
  25.   return (ulonglong)tp.tv_sec*10000000+(ulonglong)tp.tv_nsec/100;
  26. #elif defined(__WIN__)
  27. #define OFFSET_TO_EPOC ((__int64) 134774 * 24 * 60 * 60 * 1000 * 1000 * 10)
  28.   static __int64 offset=0, freq;
  29.   LARGE_INTEGER t_cnt;
  30.   if (!offset)
  31.   {
  32.     /* strictly speaking there should be a mutex to protect
  33.        initialization section. But my_getsystime() is called from
  34.        UUID() code, and UUID() calls are serialized with a mutex anyway
  35.     */
  36.     LARGE_INTEGER li;
  37.     FILETIME ft;
  38.     GetSystemTimeAsFileTime(&ft);
  39.     li.LowPart=ft.dwLowDateTime;
  40.     li.HighPart=ft.dwHighDateTime;
  41.     offset=li.QuadPart-OFFSET_TO_EPOC;
  42.     QueryPerformanceFrequency(&li);
  43.     freq=li.QuadPart;
  44.     QueryPerformanceCounter(&t_cnt);
  45.     offset-=t_cnt.QuadPart/freq*10000000+t_cnt.QuadPart%freq*10000000/freq;
  46.   }
  47.   QueryPerformanceCounter(&t_cnt);
  48.   return t_cnt.QuadPart/freq*10000000+t_cnt.QuadPart%freq*10000000/freq+offset;
  49. #elif defined(__NETWARE__)
  50.   NXTime_t tm;
  51.   NXGetTime(NX_SINCE_1970, NX_NSECONDS, &tm);
  52.   return (ulonglong)tm/100;
  53. #else
  54.   /* TODO: check for other possibilities for hi-res timestamping */
  55.   struct timeval tv;
  56.   gettimeofday(&tv,NULL);
  57.   return (ulonglong)tv.tv_sec*10000000+(ulonglong)tv.tv_usec*10;
  58. #endif
  59. }