Mercurial > sdl-ios-xcode
annotate src/timer/linux/SDL_systimer.c @ 1157:baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
From: Tommi Kyntola <tommi.kyntola@ray.fi>
To: sdl@libsdl.org
Subject: [SDL] [RFC] get_ticks broken on linux
It uses gettimeofday to calculate the timedifference.
Gettimeofday returns current time which is seldom monotonous.
This breaks SDL timer subsystem. (time callbacks and all that
get borked when the time difference ms is suddenly ~ 2^32)
I posted a message about this earlier but got no response.
Some thoughts on this matter would be appreciated.
(Or even an explanation for the lack of interest.)
A patch below would use the posix timers that have been around
since posix 93 and do provide a good source of monotonous time
on linux boxes (and on few others too).
The following patch is also availabe at:
http://www.hut.fi/u/tkyntola/SDL-1.2.9-clockfix.patch
It's against 1.2.9, but I can easily rediffit against
the cvs branch is needed.
cheers,
Tommi Kyntola tommi.kyntola@ray.fi
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Tue, 11 Oct 2005 18:16:12 +0000 |
parents | 8521404a33c7 |
children | ec446adf8cb2 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
769
b8d311d90021
Updated copyright information for 2004 (Happy New Year!)
Sam Lantinga <slouken@libsdl.org>
parents:
415
diff
changeset
|
3 Copyright (C) 1997-2004 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
9 | |
10 This library 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 GNU | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
166
diff
changeset
|
20 slouken@libsdl.org |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
21 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
22 RDTSC stuff by lompik (lompik@voila.fr) 20/03/2002 |
0 | 23 */ |
24 | |
25 #ifdef SAVE_RCSID | |
26 static char rcsid = | |
27 "@(#) $Id$"; | |
28 #endif | |
29 | |
30 #include <stdio.h> | |
31 #include <sys/time.h> | |
32 #include <signal.h> | |
33 #include <unistd.h> | |
34 #include <string.h> | |
35 #include <errno.h> | |
36 | |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
37 /* The clock_gettime provides monotonous time, so we should use it if |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
38 it's available. The clock_gettime function is behind ifdef |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
39 for __USE_POSIX199309 |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
40 Tommi Kyntola (tommi.kyntola@ray.fi) 27/09/2005 |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
41 */ |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
42 #if (defined _POSIX_TIMERS && _POSIX_TIMERS > 0) |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
43 #include <time.h> |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
44 #define USE_CLOCK_GETTIME |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
45 #endif |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
46 |
0 | 47 #include "SDL_error.h" |
48 #include "SDL_timer.h" | |
49 #include "SDL_timer_c.h" | |
50 | |
1
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
51 #if _POSIX_THREAD_SYSCALL_SOFT |
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
52 #include <pthread.h> |
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
53 #endif |
415
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
54 #ifdef ENABLE_PTH |
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
55 #include <pth.h> |
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
56 #endif |
1
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
57 |
0 | 58 #if defined(DISABLE_THREADS) || defined(FORK_HACK) |
59 #define USE_ITIMER | |
60 #endif | |
61 | |
62 /* The following defines should really be determined at configure time */ | |
63 | |
166
39877400bd1e
Fixed Solaris nitpicks (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents:
1
diff
changeset
|
64 #if defined(linux) |
0 | 65 /* Linux select() changes its timeout parameter upon return to contain |
66 the remaining time. Most other unixen leave it unchanged or undefined. */ | |
67 #define SELECT_SETS_REMAINING | |
1156
8521404a33c7
Date: Tue, 11 Oct 2005 16:58:12 +0300 (EEST)
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
68 #elif defined(__bsdi__) || defined(__FreeBSD__) || defined(__sun) || defined(MACOSX) |
0 | 69 #define USE_NANOSLEEP |
70 #endif | |
71 | |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
72 #if defined(i386) || defined(__i386__) |
317
4e8827521296
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
316
diff
changeset
|
73 /* This only works on pentium or newer x86 processors */ |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
74 /* Actually, this isn't reliable on multi-cpu systems, so is disabled */ |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
75 /*#define USE_RDTSC*/ |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
76 #endif |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
77 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
78 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
79 #ifdef USE_RDTSC |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
80 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
81 /* The first ticks value of the application */ |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
82 static unsigned long long start; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
83 static float cpu_mhz1000 = 0.0f; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
84 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
85 #if 1 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
86 /* This is for old binutils version that don't recognize rdtsc mnemonics. |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
87 But all binutils version supports this. |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
88 */ |
392
71fe0b713085
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
317
diff
changeset
|
89 #define rdtsc(t) asm __volatile__ (".byte 0x0f, 0x31; " : "=A" (t)) |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
90 #else |
392
71fe0b713085
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
317
diff
changeset
|
91 #define rdtsc(t) asm __volatile__ ("rdtsc" : "=A" (t)) |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
92 #endif |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
93 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
94 static float calc_cpu_mhz(void) |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
95 { |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
96 float cpu_mhz; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
97 unsigned long long tsc_start; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
98 unsigned long long tsc_end; |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
99 /* Slight code doubling here for the sake of readability */ |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
100 #ifdef USE_CLOCK_GETTIME |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
101 struct timespec tv_start, tv_end; |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
102 long usec_delay; |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
103 |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
104 rdtsc(tsc_start); |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
105 clock_gettime(CLOCK_MONOTONIC,&tv_start); |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
106 sleep(1); |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
107 rdtsc(tsc_end); |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
108 clock_gettime(CLOCK_MONOTONIC,&tv_end); |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
109 usec_delay = (1000000000L * (tv_end.tv_sec - tv_start.tv_sec) + |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
110 (tv_end.tv_nsec - tv_start.tv_nsec)) / 1000; |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
111 #else |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
112 struct timeval tv_start, tv_end; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
113 long usec_delay; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
114 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
115 rdtsc(tsc_start); |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
116 gettimeofday(&tv_start, NULL); |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
117 sleep(1); |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
118 rdtsc(tsc_end); |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
119 gettimeofday(&tv_end, NULL); |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
120 usec_delay = 1000000L * (tv_end.tv_sec - tv_start.tv_sec) + |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
121 (tv_end.tv_usec - tv_start.tv_usec); |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
122 #endif /* USE_CLOCK_GETTIME */ |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
123 cpu_mhz = (float)(tsc_end-tsc_start) / usec_delay; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
124 #if 0 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
125 printf("cpu MHz\t\t: %.3f\n", cpu_mhz); |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
126 #endif |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
127 return cpu_mhz; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
128 } |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
129 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
130 #else |
0 | 131 |
132 /* The first ticks value of the application */ | |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
133 #ifdef USE_CLOCK_GETTIME |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
134 static struct timespec start; |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
135 #else |
0 | 136 static struct timeval start; |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
137 #endif /* USE_CLOCK_GETTIME */ |
0 | 138 |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
139 #endif /* USE_RDTSC */ |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
140 |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
141 |
0 | 142 void SDL_StartTicks(void) |
143 { | |
144 /* Set first ticks value */ | |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
145 #ifdef USE_RDTSC |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
146 if ( ! cpu_mhz1000 ) { |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
147 cpu_mhz1000 = calc_cpu_mhz() * 1000.0f; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
148 } |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
149 rdtsc(start); |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
150 #elif defined(USE_CLOCK_GETTIME) |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
151 clock_gettime(CLOCK_MONOTONIC,&start); |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
152 #else |
0 | 153 gettimeofday(&start, NULL); |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
154 #endif |
0 | 155 } |
156 | |
157 Uint32 SDL_GetTicks (void) | |
158 { | |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
159 #ifdef USE_RDTSC |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
160 unsigned long long now; |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
161 if ( ! cpu_mhz1000 ) { |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
162 return 0; /* Shouldn't happen. BUG!! */ |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
163 } |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
164 rdtsc(now); |
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
165 return (Uint32)((now-start)/cpu_mhz1000); |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
166 #elif defined(USE_CLOCK_GETTIME) |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
167 Uint32 ticks; |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
168 struct timespec now; |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
169 clock_gettime(CLOCK_MONOTONIC,&now); |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
170 ticks=(now.tv_sec-start.tv_sec)*1000+(now.tv_nsec-start.tv_nsec)/1000000; |
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
171 return(ticks); |
316
d85fc19bf840
Added UNIX RDTSC code by Lompak (disabled by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
172 #else |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
173 Uint32 ticks; |
0 | 174 struct timeval now; |
175 gettimeofday(&now, NULL); | |
176 ticks=(now.tv_sec-start.tv_sec)*1000+(now.tv_usec-start.tv_usec)/1000; | |
177 return(ticks); | |
1157
baf35853ad54
Date: Mon, 10 Oct 2005 13:09:32 +0300
Ryan C. Gordon <icculus@icculus.org>
parents:
1156
diff
changeset
|
178 #endif |
0 | 179 } |
180 | |
181 void SDL_Delay (Uint32 ms) | |
182 { | |
415
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
183 #ifdef ENABLE_PTH |
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
184 pth_time_t tv; |
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
185 tv.tv_sec = ms/1000; |
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
186 tv.tv_usec = (ms%1000)*1000; |
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
187 pth_nap(tv); |
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
188 #else |
0 | 189 int was_error; |
190 | |
191 #ifdef USE_NANOSLEEP | |
192 struct timespec elapsed, tv; | |
193 #else | |
194 struct timeval tv; | |
195 #ifndef SELECT_SETS_REMAINING | |
196 Uint32 then, now, elapsed; | |
197 #endif | |
198 #endif | |
199 | |
200 /* Set the timeout interval - Linux only needs to do this once */ | |
201 #ifdef SELECT_SETS_REMAINING | |
202 tv.tv_sec = ms/1000; | |
203 tv.tv_usec = (ms%1000)*1000; | |
204 #elif defined(USE_NANOSLEEP) | |
205 elapsed.tv_sec = ms/1000; | |
206 elapsed.tv_nsec = (ms%1000)*1000000; | |
207 #else | |
208 then = SDL_GetTicks(); | |
209 #endif | |
210 do { | |
211 errno = 0; | |
212 | |
1
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
213 #if _POSIX_THREAD_SYSCALL_SOFT |
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
214 pthread_yield_np(); |
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
215 #endif |
0 | 216 #ifdef USE_NANOSLEEP |
217 tv.tv_sec = elapsed.tv_sec; | |
218 tv.tv_nsec = elapsed.tv_nsec; | |
219 was_error = nanosleep(&tv, &elapsed); | |
220 #else | |
221 #ifndef SELECT_SETS_REMAINING | |
222 /* Calculate the time interval left (in case of interrupt) */ | |
223 now = SDL_GetTicks(); | |
224 elapsed = (now-then); | |
225 then = now; | |
226 if ( elapsed >= ms ) { | |
227 break; | |
228 } | |
229 ms -= elapsed; | |
230 tv.tv_sec = ms/1000; | |
231 tv.tv_usec = (ms%1000)*1000; | |
232 #endif | |
233 was_error = select(0, NULL, NULL, NULL, &tv); | |
234 #endif /* USE_NANOSLEEP */ | |
235 } while ( was_error && (errno == EINTR) ); | |
415
104f32d04cd1
Fixed building with pthreads and the pth library
Sam Lantinga <slouken@libsdl.org>
parents:
392
diff
changeset
|
236 #endif /* ENABLE_PTH */ |
0 | 237 } |
238 | |
239 #ifdef USE_ITIMER | |
240 | |
241 static void HandleAlarm(int sig) | |
242 { | |
243 Uint32 ms; | |
244 | |
245 if ( SDL_alarm_callback ) { | |
246 ms = (*SDL_alarm_callback)(SDL_alarm_interval); | |
247 if ( ms != SDL_alarm_interval ) { | |
248 SDL_SetTimer(ms, SDL_alarm_callback); | |
249 } | |
250 } | |
251 } | |
252 | |
253 int SDL_SYS_TimerInit(void) | |
254 { | |
255 struct sigaction action; | |
256 | |
257 /* Set the alarm handler (Linux specific) */ | |
258 memset(&action, 0, sizeof(action)); | |
259 action.sa_handler = HandleAlarm; | |
260 action.sa_flags = SA_RESTART; | |
261 sigemptyset(&action.sa_mask); | |
262 sigaction(SIGALRM, &action, NULL); | |
263 return(0); | |
264 } | |
265 | |
266 void SDL_SYS_TimerQuit(void) | |
267 { | |
268 SDL_SetTimer(0, NULL); | |
269 } | |
270 | |
271 int SDL_SYS_StartTimer(void) | |
272 { | |
273 struct itimerval timer; | |
274 | |
275 timer.it_value.tv_sec = (SDL_alarm_interval/1000); | |
276 timer.it_value.tv_usec = (SDL_alarm_interval%1000)*1000; | |
277 timer.it_interval.tv_sec = (SDL_alarm_interval/1000); | |
278 timer.it_interval.tv_usec = (SDL_alarm_interval%1000)*1000; | |
279 setitimer(ITIMER_REAL, &timer, NULL); | |
280 return(0); | |
281 } | |
282 | |
283 void SDL_SYS_StopTimer(void) | |
284 { | |
285 struct itimerval timer; | |
286 | |
287 memset(&timer, 0, (sizeof timer)); | |
288 setitimer(ITIMER_REAL, &timer, NULL); | |
289 } | |
290 | |
291 #else /* USE_ITIMER */ | |
292 | |
293 #include "SDL_thread.h" | |
294 | |
295 /* Data to handle a single periodic alarm */ | |
296 static int timer_alive = 0; | |
297 static SDL_Thread *timer = NULL; | |
298 | |
299 static int RunTimer(void *unused) | |
300 { | |
301 while ( timer_alive ) { | |
302 if ( SDL_timer_running ) { | |
303 SDL_ThreadedTimerCheck(); | |
304 } | |
305 SDL_Delay(1); | |
306 } | |
307 return(0); | |
308 } | |
309 | |
310 /* This is only called if the event thread is not running */ | |
311 int SDL_SYS_TimerInit(void) | |
312 { | |
313 timer_alive = 1; | |
314 timer = SDL_CreateThread(RunTimer, NULL); | |
315 if ( timer == NULL ) | |
316 return(-1); | |
317 return(SDL_SetTimerThreaded(1)); | |
318 } | |
319 | |
320 void SDL_SYS_TimerQuit(void) | |
321 { | |
322 timer_alive = 0; | |
323 if ( timer ) { | |
324 SDL_WaitThread(timer, NULL); | |
325 timer = NULL; | |
326 } | |
327 } | |
328 | |
329 int SDL_SYS_StartTimer(void) | |
330 { | |
331 SDL_SetError("Internal logic error: Linux uses threaded timer"); | |
332 return(-1); | |
333 } | |
334 | |
335 void SDL_SYS_StopTimer(void) | |
336 { | |
337 return; | |
338 } | |
339 | |
340 #endif /* USE_ITIMER */ |