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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL 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. #include <ndb_global.h>
  14. #include "NdbTick.h"
  15. #define NANOSEC_PER_SEC  1000000000
  16. #define MICROSEC_PER_SEC 1000000
  17. #define MILLISEC_PER_SEC 1000
  18. #define MICROSEC_PER_MILLISEC 1000
  19. #define MILLISEC_PER_NANOSEC 1000000
  20. #ifdef HAVE_CLOCK_GETTIME
  21. NDB_TICKS NdbTick_CurrentMillisecond(void)
  22. {
  23.   struct timespec tick_time;
  24.   clock_gettime(CLOCK_REALTIME, &tick_time);
  25.   return 
  26.     ((NDB_TICKS)tick_time.tv_sec)  * ((NDB_TICKS)MILLISEC_PER_SEC) +
  27.     ((NDB_TICKS)tick_time.tv_nsec) / ((NDB_TICKS)MILLISEC_PER_NANOSEC);
  28. }
  29. int 
  30. NdbTick_CurrentMicrosecond(NDB_TICKS * secs, Uint32 * micros){
  31.   struct timespec t;
  32.   int res = clock_gettime(CLOCK_REALTIME, &t);
  33.   * secs   = t.tv_sec;
  34.   * micros = t.tv_nsec / 1000;
  35.   return res;
  36. }
  37. #else
  38. NDB_TICKS NdbTick_CurrentMillisecond(void)
  39. {
  40.   struct timeval tick_time;
  41.   gettimeofday(&tick_time, 0);
  42.   return 
  43.     ((NDB_TICKS)tick_time.tv_sec)  * ((NDB_TICKS)MILLISEC_PER_SEC) +
  44.     ((NDB_TICKS)tick_time.tv_usec) / ((NDB_TICKS)MICROSEC_PER_MILLISEC);
  45. }
  46. int 
  47. NdbTick_CurrentMicrosecond(NDB_TICKS * secs, Uint32 * micros){
  48.   struct timeval tick_time;
  49.   int res = gettimeofday(&tick_time, 0);
  50.   if(secs==0) {
  51.     NDB_TICKS secs   = tick_time.tv_sec;
  52.     *micros = tick_time.tv_usec;
  53.     *micros = secs*1000000+*micros;    
  54.   } else {
  55.       * secs   = tick_time.tv_sec;
  56.       * micros = tick_time.tv_usec;
  57.     }
  58.   return res;
  59. }
  60. #endif
  61. #ifdef TIME_MEASUREMENT
  62. int
  63. NdbTick_getMicroTimer(struct MicroSecondTimer* input_timer)
  64. {
  65.   NDB_TICKS secs;
  66.   Uint32 mics;
  67.   int ret_value;
  68.   ret_value = NdbTick_CurrentMicrosecond(&secs, &mics);
  69.   input_timer->seconds = secs;
  70.   input_timer->micro_seconds = (NDB_TICKS)mics;
  71.   return ret_value;
  72. }
  73. NDB_TICKS
  74. NdbTick_getMicrosPassed(struct MicroSecondTimer start,
  75.                         struct MicroSecondTimer stop)
  76. {
  77.   NDB_TICKS ret_value = (NDB_TICKS)0;
  78.   if (start.seconds < stop.seconds) {
  79.     NDB_TICKS sec_passed = stop.seconds - start.seconds;
  80.     ret_value = ((NDB_TICKS)MICROSEC_PER_SEC) * sec_passed;
  81.   } else if (start.seconds > stop.seconds) {
  82.     return ret_value;
  83.   }
  84.   if (start.micro_seconds < stop.micro_seconds) {
  85.     ret_value += (stop.micro_seconds - start.micro_seconds);
  86.   } else if (ret_value != (NDB_TICKS)0) {
  87.     ret_value -= (start.micro_seconds - stop.micro_seconds);
  88.   }
  89.   return ret_value;
  90. }
  91. #endif