[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 5/6] libc: POSIX: alarm()



+ lib: POSIX: Weniger gefakte Implementierung von alarm()
---
 src/modules/include/unistd.h   |    6 +++---
 src/modules/lib/posix/signal.c |   19 ++++++++++++++++---
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/src/modules/include/unistd.h b/src/modules/include/unistd.h
index c7b7bbb..18ffd07 100644
--- a/src/modules/include/unistd.h
+++ b/src/modules/include/unistd.h
@@ -121,6 +121,9 @@ ssize_t pread(int fd, void *buf, size_t count, off_t offset);
 /// In eine Datei mit gegebenem Offset schreiben
 ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
 
+/// Timer setzen nach dem ein SIGALARM gesendet werden soll
+long alarm(long seconds);
+
 #ifndef CONFIG_LIBC_NO_STUBS
 /// Prozess klonen
 pid_t fork(void);
@@ -137,9 +140,6 @@ int dup(int fd);
 /// Dateideskriptor duplizieren
 int dup2(int fd, int new_fd);
 
-/// Timer setzen nach dem ein SIGALARM gesendet werden soll
-long alarm(long seconds);
-
 /// Warten bis zeit abgelaufen ist, oder Signal eintrifft
 unsigned int sleep(unsigned int seconds);
 
diff --git a/src/modules/lib/posix/signal.c b/src/modules/lib/posix/signal.c
index ee37e27..63d54b3 100644
--- a/src/modules/lib/posix/signal.c
+++ b/src/modules/lib/posix/signal.c
@@ -259,14 +259,27 @@ int sigismember(const sigset_t *sigset, int signum)
     return ((sigset->bitmask[signum / 8] & (1 <<(signum % 8))) != 0);
 }
 
+/**
+ * Callbackfunktion fuer alarm()
+ */
+static void do_alarm(void)
+{
+    raise(SIGALRM);
+}
 
-#ifndef CONFIG_LIBC_NO_STUBS
 /**
  * Timer setzen, der beim ablaufen ein SIGALARM sendet
  */
 long alarm(long seconds)
 {
+    static dword id = 0;
+
+    if (id != 0) {
+        timer_cancel(id);
+    }
+
+    id = timer_register(do_alarm, seconds * 1000000);
+
+    // FIXME
     return 0;
 }
-#endif
-
-- 
1.5.4.5