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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1 /*
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
4
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
5 This library is free software; you can redistribute it and/or
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
6 modify it under the terms of the GNU Library General Public
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
7 License as published by the Free Software Foundation; either
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
8 version 2 of the License, or (at your option) any later version.
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
9
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
10 This library is distributed in the hope that it will be useful,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
13 Library General Public License for more details.
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
14
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
15 You should have received a copy of the GNU Library General Public
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
16 License along with this library; if not, write to the Free
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
18
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
23 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
24
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
25 #ifdef SAVE_RCSID
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
26 static char rcsid =
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
27 "@(#) $Id$";
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
28 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
29
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
30 #include <stdio.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
31 #include <sys/time.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
32 #include <signal.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
33 #include <unistd.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
34 #include <string.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
35 #include <errno.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
47 #include "SDL_error.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
48 #include "SDL_timer.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
49 #include "SDL_timer_c.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
58 #if defined(DISABLE_THREADS) || defined(FORK_HACK)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
59 #define USE_ITIMER
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
60 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
61
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
62 /* The following defines should really be determined at configure time */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
63
166
39877400bd1e Fixed Solaris nitpicks (thanks Mattias!)
Sam Lantinga <slouken@libsdl.org>
parents: 1
diff changeset
64 #if defined(linux)
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
65 /* Linux select() changes its timeout parameter upon return to contain
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
66 the remaining time. Most other unixen leave it unchanged or undefined. */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
69 #define USE_NANOSLEEP
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
70 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
131
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
142 void SDL_StartTicks(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
143 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
155 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
156
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
157 Uint32 SDL_GetTicks (void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
174 struct timeval now;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
175 gettimeofday(&now, NULL);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
176 ticks=(now.tv_sec-start.tv_sec)*1000+(now.tv_usec-start.tv_usec)/1000;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
179 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
180
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
181 void SDL_Delay (Uint32 ms)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
189 int was_error;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
190
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
191 #ifdef USE_NANOSLEEP
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
192 struct timespec elapsed, tv;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
193 #else
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
194 struct timeval tv;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
195 #ifndef SELECT_SETS_REMAINING
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
196 Uint32 then, now, elapsed;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
197 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
198 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
199
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
200 /* Set the timeout interval - Linux only needs to do this once */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
201 #ifdef SELECT_SETS_REMAINING
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
202 tv.tv_sec = ms/1000;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
203 tv.tv_usec = (ms%1000)*1000;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
204 #elif defined(USE_NANOSLEEP)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
205 elapsed.tv_sec = ms/1000;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
206 elapsed.tv_nsec = (ms%1000)*1000000;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
207 #else
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
208 then = SDL_GetTicks();
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
209 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
210 do {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
211 errno = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
216 #ifdef USE_NANOSLEEP
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
217 tv.tv_sec = elapsed.tv_sec;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
218 tv.tv_nsec = elapsed.tv_nsec;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
219 was_error = nanosleep(&tv, &elapsed);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
220 #else
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
221 #ifndef SELECT_SETS_REMAINING
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
222 /* Calculate the time interval left (in case of interrupt) */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
223 now = SDL_GetTicks();
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
224 elapsed = (now-then);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
225 then = now;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
226 if ( elapsed >= ms ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
227 break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
228 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
229 ms -= elapsed;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
230 tv.tv_sec = ms/1000;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
231 tv.tv_usec = (ms%1000)*1000;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
232 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
233 was_error = select(0, NULL, NULL, NULL, &tv);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
234 #endif /* USE_NANOSLEEP */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
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
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
237 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
238
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
239 #ifdef USE_ITIMER
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
240
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
241 static void HandleAlarm(int sig)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
242 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
243 Uint32 ms;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
244
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
245 if ( SDL_alarm_callback ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
246 ms = (*SDL_alarm_callback)(SDL_alarm_interval);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
247 if ( ms != SDL_alarm_interval ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
248 SDL_SetTimer(ms, SDL_alarm_callback);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
249 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
250 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
251 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
252
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
253 int SDL_SYS_TimerInit(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
254 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
255 struct sigaction action;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
256
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
257 /* Set the alarm handler (Linux specific) */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
258 memset(&action, 0, sizeof(action));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
259 action.sa_handler = HandleAlarm;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
260 action.sa_flags = SA_RESTART;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
261 sigemptyset(&action.sa_mask);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
262 sigaction(SIGALRM, &action, NULL);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
263 return(0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
264 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
265
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
266 void SDL_SYS_TimerQuit(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
267 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
268 SDL_SetTimer(0, NULL);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
269 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
270
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
271 int SDL_SYS_StartTimer(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
272 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
273 struct itimerval timer;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
274
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
275 timer.it_value.tv_sec = (SDL_alarm_interval/1000);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
276 timer.it_value.tv_usec = (SDL_alarm_interval%1000)*1000;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
277 timer.it_interval.tv_sec = (SDL_alarm_interval/1000);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
278 timer.it_interval.tv_usec = (SDL_alarm_interval%1000)*1000;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
279 setitimer(ITIMER_REAL, &timer, NULL);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
280 return(0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
281 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
282
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
283 void SDL_SYS_StopTimer(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
284 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
285 struct itimerval timer;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
286
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
287 memset(&timer, 0, (sizeof timer));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
288 setitimer(ITIMER_REAL, &timer, NULL);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
289 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
290
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
291 #else /* USE_ITIMER */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
292
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
293 #include "SDL_thread.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
294
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
295 /* Data to handle a single periodic alarm */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
296 static int timer_alive = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
297 static SDL_Thread *timer = NULL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
298
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
299 static int RunTimer(void *unused)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
300 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
301 while ( timer_alive ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
302 if ( SDL_timer_running ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
303 SDL_ThreadedTimerCheck();
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
304 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
305 SDL_Delay(1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
306 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
307 return(0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
308 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
309
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
310 /* This is only called if the event thread is not running */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
311 int SDL_SYS_TimerInit(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
312 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
313 timer_alive = 1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
314 timer = SDL_CreateThread(RunTimer, NULL);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
315 if ( timer == NULL )
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
316 return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
317 return(SDL_SetTimerThreaded(1));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
318 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
319
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
320 void SDL_SYS_TimerQuit(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
321 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
322 timer_alive = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
323 if ( timer ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
324 SDL_WaitThread(timer, NULL);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
325 timer = NULL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
326 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
327 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
328
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
329 int SDL_SYS_StartTimer(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
330 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
331 SDL_SetError("Internal logic error: Linux uses threaded timer");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
332 return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
333 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
334
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
335 void SDL_SYS_StopTimer(void)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
336 {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
337 return;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
338 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
339
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
340 #endif /* USE_ITIMER */