summaryrefslogtreecommitdiffstats
path: root/linux
diff options
context:
space:
mode:
authornick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-02-25 14:24:11 +0000
committernick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-02-25 14:24:11 +0000
commitcb7768f9bb35b55ae27835525cc6effe19ad099f (patch)
tree06f86a0c604bd9ae58a8135787b9b4a69f25ac95 /linux
parent1fe9e6e3bb85b1e85bb0164a7a28115d091da883 (diff)
downloadmpv-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')
-rw-r--r--linux/Makefile2
-rw-r--r--linux/timer.c40
-rw-r--r--linux/timer.h8
3 files changed, 49 insertions, 1 deletions
diff --git a/linux/Makefile b/linux/Makefile
index f6fb05ad96..5c11a5e00c 100644
--- a/linux/Makefile
+++ b/linux/Makefile
@@ -3,7 +3,7 @@ include ../config.mak
LIBNAME = libosdep.a
-SRCS=getch2.c timer-lx.c shmem.c
+SRCS=getch2.c timer-lx.c timer.c shmem.c
OBJS=$(SRCS:.c=.o)
ifeq ($(TARGET_ARCH_X86),yes)
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);
+}
diff --git a/linux/timer.h b/linux/timer.h
index d51155f8a8..efda23ad6c 100644
--- a/linux/timer.h
+++ b/linux/timer.h
@@ -1,3 +1,5 @@
+#ifndef __TIMER_H
+#define __TIMER_H
void InitTimer();
unsigned int GetTimer();
@@ -7,3 +9,9 @@ float GetRelativeTime();
int usec_sleep(int usec_delay);
+/* timer's callback handling */
+typedef void timer_callback( void );
+extern unsigned set_timer_callback(unsigned ms,timer_callback func);
+extern void restore_timer(void);
+
+#endif