Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
248 lines (198 loc) · 5.05 KB

SDL_systimer.c

File metadata and controls

248 lines (198 loc) · 5.05 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
Sam Lantinga
Feb 1, 2006
Feb 1, 2006
20
slouken@libsdl.org
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 14, 2006
Apr 14, 2006
24
25
#ifdef SDL_TIMER_RISCOS
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include "SDL_timer.h"
Feb 16, 2006
Feb 16, 2006
34
#include "../SDL_timer_c.h"
Feb 16, 2006
Feb 16, 2006
36
37
#if SDL_THREADS_DISABLED
/* Timer SDL_arraysize(Timer ),start/reset time */
38
39
40
static Uint32 timerStart;
/* Timer running function */
void RISCOS_CheckTimer();
Sep 17, 2004
Sep 17, 2004
41
42
43
44
45
46
47
48
#else
#include <pthread.h>
extern Uint32 riscos_main_thread;
extern int riscos_using_threads;
extern Uint32 SDL_ThreadID();
extern Uint32 SDL_EventThreadID(void);
#endif
49
50
51
52
53
54
extern void RISCOS_BackgroundTasks(void);
/* The first ticks value of the application */
clock_t start;
Jul 10, 2006
Jul 10, 2006
55
56
void
SDL_StartTicks(void)
Jul 10, 2006
Jul 10, 2006
58
59
/* Set first ticks value */
start = clock();
Jul 10, 2006
Jul 10, 2006
62
63
Uint32
SDL_GetTicks(void)
Jul 10, 2006
Jul 10, 2006
65
clock_t ticks;
Jul 10, 2006
Jul 10, 2006
67
ticks = clock() - start;
68
69
70
71
#if CLOCKS_PER_SEC == 1000
Jul 10, 2006
Jul 10, 2006
72
return (ticks);
73
74
75
#elif CLOCKS_PER_SEC == 100
Jul 10, 2006
Jul 10, 2006
76
return (ticks * 10);
Jul 10, 2006
Jul 10, 2006
80
return ticks * (1000 / CLOCKS_PER_SEC);
81
82
83
84
85
#endif
}
Jul 10, 2006
Jul 10, 2006
86
87
void
SDL_Delay(Uint32 ms)
Jul 10, 2006
Jul 10, 2006
89
Uint32 now, then, elapsed;
Feb 16, 2006
Feb 16, 2006
90
#if !SDL_THREADS_DISABLED
Sep 17, 2004
Sep 17, 2004
91
int is_event_thread;
Jul 10, 2006
Jul 10, 2006
92
93
94
95
96
97
98
99
100
if (riscos_using_threads) {
is_event_thread = 0;
if (SDL_EventThreadID()) {
if (SDL_EventThreadID() == SDL_ThreadID())
is_event_thread = 1;
} else if (SDL_ThreadID() == riscos_main_thread)
is_event_thread = 1;
} else
is_event_thread = 1;
Sep 17, 2004
Sep 17, 2004
101
102
#endif
Jul 10, 2006
Jul 10, 2006
103
104
/*TODO: Next version of Unixlib may allow us to use usleep here */
/* for non event threads */
Jul 10, 2006
Jul 10, 2006
106
107
/* Set the timeout interval - Linux only needs to do this once */
then = SDL_GetTicks();
Jul 10, 2006
Jul 10, 2006
109
110
do {
/* Do background tasks required while sleeping as we are not multithreaded */
Feb 16, 2006
Feb 16, 2006
111
#if SDL_THREADS_DISABLED
Jul 10, 2006
Jul 10, 2006
112
RISCOS_BackgroundTasks();
Sep 17, 2004
Sep 17, 2004
113
#else
Jul 10, 2006
Jul 10, 2006
114
115
116
/* For threaded build only run background tasks in event thread */
if (is_event_thread)
RISCOS_BackgroundTasks();
Sep 17, 2004
Sep 17, 2004
117
118
#endif
Jul 10, 2006
Jul 10, 2006
119
120
121
122
123
124
125
126
/* Calculate the time interval left (in case of interrupt) */
now = SDL_GetTicks();
elapsed = (now - then);
then = now;
if (elapsed >= ms) {
break;
}
ms -= elapsed;
Feb 16, 2006
Feb 16, 2006
127
#if !SDL_THREADS_DISABLED
Jul 10, 2006
Jul 10, 2006
128
129
130
/* Need to yield to let other threads have a go */
if (riscos_using_threads)
pthread_yield();
Sep 17, 2004
Sep 17, 2004
131
#endif
Aug 27, 2008
Aug 27, 2008
133
} while (1);
Feb 16, 2006
Feb 16, 2006
136
#if SDL_THREADS_DISABLED
Sep 17, 2004
Sep 17, 2004
137
138
139
/* Non-threaded version of timer */
Jul 10, 2006
Jul 10, 2006
140
141
int
SDL_SYS_TimerInit(void)
Jul 10, 2006
Jul 10, 2006
143
return (0);
Jul 10, 2006
Jul 10, 2006
146
147
void
SDL_SYS_TimerQuit(void)
Jul 10, 2006
Jul 10, 2006
149
SDL_SetTimer(0, NULL);
Jul 10, 2006
Jul 10, 2006
152
153
int
SDL_SYS_StartTimer(void)
Jul 10, 2006
Jul 10, 2006
155
timerStart = SDL_GetTicks();
Jul 10, 2006
Jul 10, 2006
157
return (0);
Jul 10, 2006
Jul 10, 2006
160
161
void
SDL_SYS_StopTimer(void)
Jul 10, 2006
Jul 10, 2006
163
164
/* Don't need to do anything as we use SDL_timer_running
to detect if we need to check the timer */
Jul 10, 2006
Jul 10, 2006
168
169
void
RISCOS_CheckTimer()
Jul 10, 2006
Jul 10, 2006
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
if (SDL_timer_running
&& SDL_GetTicks() - timerStart >= SDL_alarm_interval) {
Uint32 ms;
ms = SDL_alarm_callback(SDL_alarm_interval);
if (ms != SDL_alarm_interval) {
if (ms) {
SDL_alarm_interval = ROUND_RESOLUTION(ms);
} else {
SDL_alarm_interval = 0;
SDL_timer_running = 0;
}
}
if (SDL_alarm_interval)
timerStart = SDL_GetTicks();
}
Sep 17, 2004
Sep 17, 2004
188
189
190
191
192
193
194
195
196
197
198
#else
/* Threaded version of timer - based on code for linux */
#include "SDL_thread.h"
/* Data to handle a single periodic alarm */
static int timer_alive = 0;
static SDL_Thread *timer = NULL;
Jul 10, 2006
Jul 10, 2006
199
200
static int
RunTimer(void *unused)
Sep 17, 2004
Sep 17, 2004
201
{
Jul 10, 2006
Jul 10, 2006
202
203
204
205
206
207
208
while (timer_alive) {
if (SDL_timer_running) {
SDL_ThreadedTimerCheck();
}
SDL_Delay(1);
}
return (0);
Sep 17, 2004
Sep 17, 2004
209
210
211
}
/* This is only called if the event thread is not running */
Jul 10, 2006
Jul 10, 2006
212
213
int
SDL_SYS_TimerInit(void)
Sep 17, 2004
Sep 17, 2004
214
{
Jul 10, 2006
Jul 10, 2006
215
216
217
218
219
timer_alive = 1;
timer = SDL_CreateThread(RunTimer, NULL);
if (timer == NULL)
return (-1);
return (SDL_SetTimerThreaded(1));
Sep 17, 2004
Sep 17, 2004
220
221
}
Jul 10, 2006
Jul 10, 2006
222
223
void
SDL_SYS_TimerQuit(void)
Sep 17, 2004
Sep 17, 2004
224
{
Jul 10, 2006
Jul 10, 2006
225
226
227
228
229
timer_alive = 0;
if (timer) {
SDL_WaitThread(timer, NULL);
timer = NULL;
}
Sep 17, 2004
Sep 17, 2004
230
231
}
Jul 10, 2006
Jul 10, 2006
232
233
int
SDL_SYS_StartTimer(void)
Sep 17, 2004
Sep 17, 2004
234
{
Jul 10, 2006
Jul 10, 2006
235
236
SDL_SetError("Internal logic error: RISC OS uses threaded timer");
return (-1);
Sep 17, 2004
Sep 17, 2004
237
238
}
Jul 10, 2006
Jul 10, 2006
239
240
void
SDL_SYS_StopTimer(void)
Sep 17, 2004
Sep 17, 2004
241
{
Jul 10, 2006
Jul 10, 2006
242
return;
Sep 17, 2004
Sep 17, 2004
243
244
}
Feb 16, 2006
Feb 16, 2006
245
#endif /* SDL_THREADS_DISABLED */
Apr 14, 2006
Apr 14, 2006
246
247
#endif /* SDL_TIMER_RISCOS */
Jul 10, 2006
Jul 10, 2006
248
/* vi: set ts=4 sw=4 expandtab: */