timer.linux.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. //Oh the fun...no multiple timers in Linux (!) so we have to roll our own...
  2. //
  3. #include <brl.mod/blitz.mod/blitz.h>
  4. #include <pthread.h>
  5. typedef struct BBTimer{
  6. pthread_t thread;
  7. int status;
  8. int puts;
  9. int gets;
  10. int start;
  11. int period;
  12. BBObject *bbTimer;
  13. }BBTimer;
  14. extern int bbMilliSecs();
  15. extern void bbDelay( int millis );
  16. extern void brl_timer__TimerFired( BBObject *bbTimer );
  17. static void timerSyncOp( BBObject *user,int ret ){
  18. BBTimer *timer=(BBTimer*)ret;
  19. ++timer->gets;
  20. switch( timer->status ){
  21. case 1:
  22. brl_timer__TimerFired( timer->bbTimer );
  23. break;
  24. case 2:
  25. if( timer->puts==timer->gets ){
  26. BBRELEASE( timer->bbTimer );
  27. free( timer );
  28. }
  29. break;
  30. }
  31. }
  32. static void *timerProc( void *data ){
  33. BBTimer *timer=(BBTimer*)data;
  34. int time=timer->start;
  35. while( timer->status==1 ){
  36. time+=timer->period;
  37. bbDelay( time-bbMilliSecs() );
  38. ++timer->puts;
  39. bbSystemPostSyncOp( timerSyncOp,&bbNullObject,(int)timer );
  40. }
  41. bbSystemPostSyncOp( timerSyncOp,&bbNullObject,(int)timer );
  42. }
  43. BBTimer *bbTimerStart( float hertz,BBObject *bbTimer ){
  44. BBTimer *timer;
  45. int start=bbMilliSecs();
  46. timer=(BBTimer*)malloc( sizeof( BBTimer ) );
  47. timer->status=1;
  48. timer->puts=1;
  49. timer->gets=0;
  50. timer->start=start;
  51. timer->period=1000.0f/hertz;
  52. timer->bbTimer=bbTimer;
  53. if( pthread_create( &timer->thread,0,(void*(*)(void*))timerProc,timer )<0 ){
  54. free( timer );
  55. return 0;
  56. }
  57. BBRETAIN( timer->bbTimer );
  58. return timer;
  59. }
  60. void bbTimerStop( BBTimer *timer,BBObject *bbTimer ){
  61. timer->status=2;
  62. }