[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