changeset 4863:df50da00260a

POSIX compatible timer's callback
author nick
date Mon, 25 Feb 2002 14:24:11 +0000
parents 8a5f63217419
children 6434171a8f35
files linux/Makefile linux/timer.c linux/timer.h
diffstat 3 files changed, 49 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/linux/Makefile	Mon Feb 25 14:23:31 2002 +0000
+++ b/linux/Makefile	Mon Feb 25 14:24:11 2002 +0000
@@ -3,7 +3,7 @@
 
 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)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linux/timer.c	Mon Feb 25 14:24:11 2002 +0000
@@ -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);
+}
--- a/linux/timer.h	Mon Feb 25 14:23:31 2002 +0000
+++ b/linux/timer.h	Mon Feb 25 14:24:11 2002 +0000
@@ -1,3 +1,5 @@
+#ifndef __TIMER_H
+#define __TIMER_H
 
 void InitTimer();
 unsigned int GetTimer();
@@ -7,3 +9,9 @@
 
 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