1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2012 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 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 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 Sam Lantinga 20 slouken (at) libsdl.org 21 */ 22 #include "SDL_config.h" 23 24 #ifdef SDL_TIMER_DC 25 26 #include <kos.h> 27 28 #include "SDL_thread.h" 29 #include "SDL_timer.h" 30 #include "../SDL_timer_c.h" 31 32 static unsigned start; 33 34 /* 35 jif = ms * HZ /1000 36 ms = jif * 1000/HZ 37 */ 38 39 void SDL_StartTicks(void) 40 { 41 /* Set first ticks value */ 42 start = jiffies; 43 } 44 45 Uint32 SDL_GetTicks(void) 46 { 47 return((jiffies-start)*1000/HZ); 48 } 49 50 void SDL_Delay(Uint32 ms) 51 { 52 thd_sleep(ms); 53 } 54 55 /* Data to handle a single periodic alarm */ 56 static int timer_alive = 0; 57 static SDL_Thread *timer = NULL; 58 59 static int RunTimer(void *unused) 60 { 61 while ( timer_alive ) { 62 if ( SDL_timer_running ) { 63 SDL_ThreadedTimerCheck(); 64 } 65 SDL_Delay(10); 66 } 67 return(0); 68 } 69 70 /* This is only called if the event thread is not running */ 71 int SDL_SYS_TimerInit(void) 72 { 73 timer_alive = 1; 74 timer = SDL_CreateThread(RunTimer, NULL); 75 if ( timer == NULL ) 76 return(-1); 77 return(SDL_SetTimerThreaded(1)); 78 } 79 80 void SDL_SYS_TimerQuit(void) 81 { 82 timer_alive = 0; 83 if ( timer ) { 84 SDL_WaitThread(timer, NULL); 85 timer = NULL; 86 } 87 } 88 89 int SDL_SYS_StartTimer(void) 90 { 91 SDL_SetError("Internal logic error: DC uses threaded timer"); 92 return(-1); 93 } 94 95 void SDL_SYS_StopTimer(void) 96 { 97 return; 98 } 99 100 #endif /* SDL_TIMER_DC */ 101