Home | History | Annotate | Download | only in dc
      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