617112e1d1ea392a1b10ec502bda7e9de842c9bf
[xonotic/netradiant.git] / radiant / timer.cpp
1 /*
2 Copyright (C) 2001-2006, William Joseph.
3 All Rights Reserved.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 #include "timer.h"
23
24
25 #if defined(WIN32)
26
27 #include <windows.h>
28
29 MillisecondTime MillisecondTime::current()
30 {
31   static class Cached
32   {
33     LONGLONG m_frequency;
34     LONGLONG m_base;
35   public:
36     Cached()
37     {
38       QueryPerformanceFrequency((LARGE_INTEGER *) &m_frequency);
39       QueryPerformanceCounter((LARGE_INTEGER *) &m_base);
40     }
41     LONGLONG frequency()
42     {
43       return m_frequency;
44     }
45     LONGLONG base()
46     {
47       return m_base;
48     }
49   } cached;
50     
51   if(cached.frequency() > 0)
52   {
53     LONGLONG count;
54     QueryPerformanceCounter((LARGE_INTEGER *) &count);
55     return time_from_ticks(count - cached.base(), cached.frequency());
56   }
57   else
58   {
59 #if 1
60     return MillisecondTime();
61 #else
62     return time_from_ticks(timeGetTime(), 1000);
63 #endif
64   }
65 }
66
67
68
69
70 #elif defined(POSIX)
71
72 #include <time.h>
73 #include "sys/time.h"
74
75 MillisecondTime MillisecondTime::current()
76 {
77   static class Cached
78   {
79     time_t m_base;
80   public:
81     Cached()
82     {
83       time(&m_base);
84     }
85     time_t base()
86     {
87       return m_base;
88     }
89   } cached;
90
91   timeval time;
92   gettimeofday(&time, 0);
93   return MillisecondTime((time.tv_sec - cached.base()) * 1000 + time.tv_usec / 1000);
94 }
95
96
97
98 #else
99
100 #include <ctime>
101
102 MillisecondTime MillisecondTime::current()
103 {
104   return time_from_ticks<std::clock_t>(std::clock(), CLOCKS_PER_SEC);
105 }
106
107
108
109 #endif