3 * coded by Ketmar // Invisible Vector <ketmar@ketmar.no-ip.org>
4 * Understanding is not required. Only obedience.
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, version 3 of the License ONLY.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 // ////////////////////////////////////////////////////////////////////////// //
19 // severely outdated, do not use!
20 module iv
.ticks
/*is aliced*/;
24 private import core
.sys
.posix
.time
;
25 // idiotic phobos forgets 'nothrow' at it
26 extern(C
) private int clock_gettime (clockid_t
, timespec
*) @trusted nothrow @nogc;
30 private enum CLOCK_MONOTONIC_RAW
= 4;
31 private enum CLOCK_MONOTONIC_COARSE
= 6;
33 shared static this () {
38 private __gshared timespec videolib_clock_stt
;
39 private __gshared
int gtClockType
= CLOCK_MONOTONIC_COARSE
;
42 nothrow @trusted @nogc:
44 private void initializeClock () {
47 if (clock_getres(gtClockType
, &cres
) == 0) {
48 if (cres
.tv_sec
== 0 && cres
.tv_nsec
<= cast(long)1000000*1 /*1 ms*/) inited
= true;
51 gtClockType
= CLOCK_MONOTONIC_RAW
;
52 if (clock_getres(gtClockType
, &cres
) == 0) {
53 if (cres
.tv_sec
== 0 && cres
.tv_nsec
<= cast(long)1000000*1 /*1 ms*/) inited
= true;
56 if (!inited
) assert(0, "FATAL: can't initialize clock subsystem!");
57 if (clock_gettime(gtClockType
, &videolib_clock_stt
) != 0) {
58 assert(0, "FATAL: can't initialize clock subsystem!");
63 /** returns monitonically increasing time; starting value is UNDEFINED (i.e. can be any number); milliseconds */
65 static if (__VERSION__
> 2067) pragma(inline
, true);
67 if (clock_gettime(gtClockType
, &ts
) != 0) assert(0, "FATAL: can't get real-time clock value!\n");
68 // ah, ignore nanoseconds in videolib_clock_stt->stt here: we need only 'differential' time, and it can start with something weird
69 return (cast(ulong)(ts
.tv_sec
-videolib_clock_stt
.tv_sec
))*1000+ts
.tv_nsec
/1000000+1;
73 /** returns monitonically increasing time; starting value is UNDEFINED (i.e. can be any number); microseconds */
74 ulong getTicksMicro () {
75 static if (__VERSION__
> 2067) pragma(inline
, true);
77 if (clock_gettime(gtClockType
, &ts
) != 0) assert(0, "FATAL: can't get real-time clock value!\n");
78 // ah, ignore nanoseconds in videolib_clock_stt->stt here: we need only 'differential' time, and it can start with something weird
79 return (cast(ulong)(ts
.tv_sec
-videolib_clock_stt
.tv_sec
))*1000000+ts
.tv_nsec
/1000+1;
81 } else version(Windows
) {
82 private import core
.sys
.windows
.winbase
: GetTickCount
;
84 ulong getTicks () { return GetTickCount(); }
86 ulong getTicksMicro () {
87 static assert(0, "iv.ticks.getTicksMicro() is not implemented on windoze");
90 static assert(0, "sorry, only GNU/Linux for now; please, fix `getTicks()` and company for your OS!");