diff options
author | nick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-02-25 14:24:11 +0000 |
---|---|---|
committer | nick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-02-25 14:24:11 +0000 |
commit | cb7768f9bb35b55ae27835525cc6effe19ad099f (patch) | |
tree | 06f86a0c604bd9ae58a8135787b9b4a69f25ac95 /linux/timer.c | |
parent | 1fe9e6e3bb85b1e85bb0164a7a28115d091da883 (diff) | |
download | mpv-cb7768f9bb35b55ae27835525cc6effe19ad099f.tar.bz2 mpv-cb7768f9bb35b55ae27835525cc6effe19ad099f.tar.xz |
POSIX compatible timer's callback
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4864 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'linux/timer.c')
-rw-r--r-- | linux/timer.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/linux/timer.c b/linux/timer.c new file mode 100644 index 0000000000..306db9c40b --- /dev/null +++ b/linux/timer.c @@ -0,0 +1,40 @@ +/* POSIX compatible timer callback */ +#include <sys/time.h> +#include <signal.h> +#include <stddef.h> + +#include "timer.h" + +static timer_callback *user_func = NULL; +static struct itimerval otimer; +static void (*old_alrm)(int) = SIG_DFL; + +static void my_alarm_handler( int signo ) +{ + if(user_func) (*user_func)(); +} + +unsigned set_timer_callback(unsigned ms,timer_callback func) +{ + unsigned ret; + struct itimerval itimer; + user_func = func; + getitimer(ITIMER_REAL,&otimer); + old_alrm = signal(SIGALRM,my_alarm_handler); + signal(SIGALRM,my_alarm_handler); + itimer.it_interval.tv_sec = 0; + itimer.it_interval.tv_usec = ms*1000; + itimer.it_value.tv_sec = 0; + itimer.it_value.tv_usec = ms*1000; + setitimer(ITIMER_REAL,&itimer,NULL); + getitimer(ITIMER_REAL,&itimer); + ret = itimer.it_interval.tv_sec*1000 + itimer.it_interval.tv_usec/1000; + if(!ret) restore_timer(); + return ret; +} + +void restore_timer(void) +{ + signal(SIGALRM,old_alrm); + setitimer(ITIMER_REAL,&otimer,NULL); +} |