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

Latest commit

 

History

History
249 lines (199 loc) · 5.09 KB

SDL_systimer.c

File metadata and controls

249 lines (199 loc) · 5.09 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Feb 1, 2006
Feb 1, 2006
3
Copyright (C) 1997-2006 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
static Uint32 timerStart;
/* Timer running function */
May 28, 2006
May 28, 2006
40
void RISCOS_CheckTimer ();
Sep 17, 2004
Sep 17, 2004
41
42
43
44
#else
#include <pthread.h>
extern Uint32 riscos_main_thread;
extern int riscos_using_threads;
May 28, 2006
May 28, 2006
45
46
extern Uint32 SDL_ThreadID ();
extern Uint32 SDL_EventThreadID (void);
Sep 17, 2004
Sep 17, 2004
47
48
#endif
May 28, 2006
May 28, 2006
50
extern void RISCOS_BackgroundTasks (void);
51
52
53
54
/* The first ticks value of the application */
clock_t start;
May 28, 2006
May 28, 2006
55
56
void
SDL_StartTicks (void)
May 28, 2006
May 28, 2006
58
59
/* Set first ticks value */
start = clock ();
May 28, 2006
May 28, 2006
62
63
Uint32
SDL_GetTicks (void)
May 28, 2006
May 28, 2006
65
clock_t ticks;
May 28, 2006
May 28, 2006
67
ticks = clock () - start;
68
69
70
71
#if CLOCKS_PER_SEC == 1000
May 28, 2006
May 28, 2006
72
return (ticks);
73
74
75
#elif CLOCKS_PER_SEC == 100
May 28, 2006
May 28, 2006
76
return (ticks * 10);
May 28, 2006
May 28, 2006
80
return ticks * (1000 / CLOCKS_PER_SEC);
81
82
83
84
85
#endif
}
May 28, 2006
May 28, 2006
86
87
void
SDL_Delay (Uint32 ms)
May 28, 2006
May 28, 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;
May 28, 2006
May 28, 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
May 28, 2006
May 28, 2006
103
104
/*TODO: Next version of Unixlib may allow us to use usleep here */
/* for non event threads */
May 28, 2006
May 28, 2006
106
107
/* Set the timeout interval - Linux only needs to do this once */
then = SDL_GetTicks ();
May 28, 2006
May 28, 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
May 28, 2006
May 28, 2006
112
RISCOS_BackgroundTasks ();
Sep 17, 2004
Sep 17, 2004
113
#else
May 28, 2006
May 28, 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
May 28, 2006
May 28, 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
May 28, 2006
May 28, 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
May 28, 2006
May 28, 2006
133
134
}
while (1);
Feb 16, 2006
Feb 16, 2006
137
#if SDL_THREADS_DISABLED
Sep 17, 2004
Sep 17, 2004
138
139
140
/* Non-threaded version of timer */
May 28, 2006
May 28, 2006
141
142
int
SDL_SYS_TimerInit (void)
May 28, 2006
May 28, 2006
144
return (0);
May 28, 2006
May 28, 2006
147
148
void
SDL_SYS_TimerQuit (void)
May 28, 2006
May 28, 2006
150
SDL_SetTimer (0, NULL);
May 28, 2006
May 28, 2006
153
154
int
SDL_SYS_StartTimer (void)
May 28, 2006
May 28, 2006
156
timerStart = SDL_GetTicks ();
May 28, 2006
May 28, 2006
158
return (0);
May 28, 2006
May 28, 2006
161
162
void
SDL_SYS_StopTimer (void)
May 28, 2006
May 28, 2006
164
165
/* Don't need to do anything as we use SDL_timer_running
to detect if we need to check the timer */
May 28, 2006
May 28, 2006
169
170
void
RISCOS_CheckTimer ()
May 28, 2006
May 28, 2006
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
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
189
190
191
192
193
194
195
196
197
198
199
#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;
May 28, 2006
May 28, 2006
200
201
static int
RunTimer (void *unused)
Sep 17, 2004
Sep 17, 2004
202
{
May 28, 2006
May 28, 2006
203
204
205
206
207
208
209
while (timer_alive) {
if (SDL_timer_running) {
SDL_ThreadedTimerCheck ();
}
SDL_Delay (1);
}
return (0);
Sep 17, 2004
Sep 17, 2004
210
211
212
}
/* This is only called if the event thread is not running */
May 28, 2006
May 28, 2006
213
214
int
SDL_SYS_TimerInit (void)
Sep 17, 2004
Sep 17, 2004
215
{
May 28, 2006
May 28, 2006
216
217
218
219
220
timer_alive = 1;
timer = SDL_CreateThread (RunTimer, NULL);
if (timer == NULL)
return (-1);
return (SDL_SetTimerThreaded (1));
Sep 17, 2004
Sep 17, 2004
221
222
}
May 28, 2006
May 28, 2006
223
224
void
SDL_SYS_TimerQuit (void)
Sep 17, 2004
Sep 17, 2004
225
{
May 28, 2006
May 28, 2006
226
227
228
229
230
timer_alive = 0;
if (timer) {
SDL_WaitThread (timer, NULL);
timer = NULL;
}
Sep 17, 2004
Sep 17, 2004
231
232
}
May 28, 2006
May 28, 2006
233
234
int
SDL_SYS_StartTimer (void)
Sep 17, 2004
Sep 17, 2004
235
{
May 28, 2006
May 28, 2006
236
237
SDL_SetError ("Internal logic error: RISC OS uses threaded timer");
return (-1);
Sep 17, 2004
Sep 17, 2004
238
239
}
May 28, 2006
May 28, 2006
240
241
void
SDL_SYS_StopTimer (void)
Sep 17, 2004
Sep 17, 2004
242
{
May 28, 2006
May 28, 2006
243
return;
Sep 17, 2004
Sep 17, 2004
244
245
}
Feb 16, 2006
Feb 16, 2006
246
#endif /* SDL_THREADS_DISABLED */
Apr 14, 2006
Apr 14, 2006
247
248
#endif /* SDL_TIMER_RISCOS */
May 28, 2006
May 28, 2006
249
/* vi: set ts=4 sw=4 expandtab: */