File: crn_timer.cpp

package info (click to toggle)
crunch-dxtc 0.55.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 3,600 kB
  • sloc: cpp: 64,979; ansic: 633; python: 321; makefile: 112
file content (142 lines) | stat: -rw-r--r-- 2,960 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// File: crn_win32_timer.cpp
// See Copyright Notice and license at the end of inc/crnlib.h
#include "crn_core.h"
#include "crn_timer.h"
#include <time.h>

#if defined(__FreeBSD__)
#include "sys/time.h"
#endif

#include "crn_timer.h"

#if CRNLIB_USE_WIN32_API
#include "crn_winhdr.h"
#endif

namespace crnlib {
unsigned long long timer::g_init_ticks;
unsigned long long timer::g_freq;
double timer::g_inv_freq;

#if defined(CRNLIB_USE_WIN32_API)
inline void query_counter(timer_ticks* pTicks) {
  QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(pTicks));
}
inline void query_counter_frequency(timer_ticks* pTicks) {
  QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(pTicks));
}
#elif defined(__GNUC__)
#include <sys/timex.h>
inline void query_counter(timer_ticks* pTicks) {
  struct timeval cur_time;
  gettimeofday(&cur_time, NULL);
  *pTicks = static_cast<unsigned long long>(cur_time.tv_sec) * 1000000ULL + static_cast<unsigned long long>(cur_time.tv_usec);
}
inline void query_counter_frequency(timer_ticks* pTicks) {
  *pTicks = 1000000;
}
#else
#error Unimplemented
#endif

timer::timer()
    : m_start_time(0),
      m_stop_time(0),
      m_started(false),
      m_stopped(false) {
  if (!g_inv_freq)
    init();
}

timer::timer(timer_ticks start_ticks) {
  if (!g_inv_freq)
    init();

  m_start_time = start_ticks;

  m_started = true;
  m_stopped = false;
}

void timer::start(timer_ticks start_ticks) {
  m_start_time = start_ticks;

  m_started = true;
  m_stopped = false;
}

void timer::start() {
  query_counter(&m_start_time);

  m_started = true;
  m_stopped = false;
}

void timer::stop() {
  CRNLIB_ASSERT(m_started);

  query_counter(&m_stop_time);

  m_stopped = true;
}

double timer::get_elapsed_secs() const {
  CRNLIB_ASSERT(m_started);
  if (!m_started)
    return 0;

  timer_ticks stop_time = m_stop_time;
  if (!m_stopped)
    query_counter(&stop_time);

  timer_ticks delta = stop_time - m_start_time;
  return delta * g_inv_freq;
}

timer_ticks timer::get_elapsed_us() const {
  CRNLIB_ASSERT(m_started);
  if (!m_started)
    return 0;

  timer_ticks stop_time = m_stop_time;
  if (!m_stopped)
    query_counter(&stop_time);

  timer_ticks delta = stop_time - m_start_time;
  return (delta * 1000000ULL + (g_freq >> 1U)) / g_freq;
}

void timer::init() {
  if (!g_inv_freq) {
    query_counter_frequency(&g_freq);
    g_inv_freq = 1.0f / g_freq;

    query_counter(&g_init_ticks);
  }
}

timer_ticks timer::get_init_ticks() {
  if (!g_inv_freq)
    init();

  return g_init_ticks;
}

timer_ticks timer::get_ticks() {
  if (!g_inv_freq)
    init();

  timer_ticks ticks;
  query_counter(&ticks);
  return ticks - g_init_ticks;
}

double timer::ticks_to_secs(timer_ticks ticks) {
  if (!g_inv_freq)
    init();

  return ticks * g_inv_freq;
}

}  // namespace crnlib