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_BEOS 25 26 #include <be/kernel/OS.h> 27 28 #include "SDL_thread.h" 29 #include "SDL_timer.h" 30 #include "../SDL_timer_c.h" 31 32 static bigtime_t start; 33 34 void SDL_StartTicks(void) 35 { 36 /* Set first ticks value */ 37 start = system_time(); 38 } 39 40 Uint32 SDL_GetTicks(void) 41 { 42 return((system_time()-start)/1000); 43 } 44 45 void SDL_Delay(Uint32 ms) 46 { 47 snooze(ms*1000); 48 } 49 50 /* Data to handle a single periodic alarm */ 51 static int timer_alive = 0; 52 static SDL_Thread *timer = NULL; 53 54 static int RunTimer(void *unused) 55 { 56 while ( timer_alive ) { 57 if ( SDL_timer_running ) { 58 SDL_ThreadedTimerCheck(); 59 } 60 SDL_Delay(10); 61 } 62 return(0); 63 } 64 65 /* This is only called if the event thread is not running */ 66 int SDL_SYS_TimerInit(void) 67 { 68 timer_alive = 1; 69 timer = SDL_CreateThread(RunTimer, NULL); 70 if ( timer == NULL ) 71 return(-1); 72 return(SDL_SetTimerThreaded(1)); 73 } 74 75 void SDL_SYS_TimerQuit(void) 76 { 77 timer_alive = 0; 78 if ( timer ) { 79 SDL_WaitThread(timer, NULL); 80 timer = NULL; 81 } 82 } 83 84 int SDL_SYS_StartTimer(void) 85 { 86 SDL_SetError("Internal logic error: BeOS uses threaded timer"); 87 return(-1); 88 } 89 90 void SDL_SYS_StopTimer(void) 91 { 92 return; 93 } 94 95 #endif /* SDL_TIMER_BEOS */ 96