diff options
author | H. Peter Anvin <hpa@zytor.com> | 2002-08-09 20:44:50 +0000 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2002-08-09 20:44:50 +0000 |
commit | c5985ed13ca2df128d3894bafc3a07f13efb2dde (patch) | |
tree | 247041d553644f64595356572cda750569665d5d | |
parent | 5f1d11bf0263e8ab25431730822db651bc925d46 (diff) | |
download | klibc-c5985ed13ca2df128d3894bafc3a07f13efb2dde.tar.gz |
Add workaround handling for missing alarm() and pause()klibc-0.3
-rw-r--r-- | SYSCALLS | 4 | ||||
-rw-r--r-- | alarm.c | 29 | ||||
-rw-r--r-- | klibc/Makefile | 2 | ||||
-rw-r--r-- | klibc/SYSCALLS | 4 | ||||
-rw-r--r-- | klibc/alarm.c | 29 | ||||
-rw-r--r-- | klibc/pause.c | 21 | ||||
-rw-r--r-- | pause.c | 21 |
7 files changed, 105 insertions, 5 deletions
diff --git a/SYSCALLS b/SYSCALLS index f12bbdf416424..5439e4a60762e 100644 --- a/SYSCALLS +++ b/SYSCALLS @@ -102,9 +102,9 @@ int kill(pid_t, int) int rt_sigaction(int, const struct sigaction *, struct sigaction *, size_t) int rt_sigsuspend(const sigset_t *, size_t) int rt_sigpending(sigset_t *, size_t) -<!alpha> int pause() -<!alpha,ia64> unsigned int alarm(unsigned int) int rt_sigprocmask(int, const sigset_t *, sigset_t *, size_t) +int getitimer(int, struct itimerval *); +int setitimer(int, const struct itimerval *, struct itimerval *); # # Time-related system calls diff --git a/alarm.c b/alarm.c new file mode 100644 index 0000000000000..b4a1ff3c70e65 --- /dev/null +++ b/alarm.c @@ -0,0 +1,29 @@ +/* + * alarm.c + */ + +#include <sys/time.h> +#include <sys/syscall.h> + +#ifdef __NR_alarm + +_syscall1(unsigned int,alarm,unsigned int,seconds); + +#else + +/* Emulate alarm() via setitimer() */ + +unsigned int alarm(unsigned int seconds) +{ + struct itimerval iv; + + iv.it_interval.tv_sec = iv.it_interval.it_usec = 0; + iv.it_value.tv_sec = seconds; + iv.it_value.tv_usec = 0; + + setitimer(ITIMER_REAL, &iv, &iv); + + return iv.it_value.tv_sec + (iv.it_value.tv_usec ? 1 : 0); +} + +#endif diff --git a/klibc/Makefile b/klibc/Makefile index 688ba2d8add8c..f05ef1a9f8652 100644 --- a/klibc/Makefile +++ b/klibc/Makefile @@ -21,7 +21,7 @@ LIBOBJS = vsnprintf.o snprintf.o vsprintf.o sprintf.o \ execl.o execle.o execv.o execvpe.o execvp.o execlp.o execlpe.o \ fork.o wait.o wait3.o waitpid.o setpgrp.o \ printf.o vprintf.o fprintf.o vfprintf.o xread.o xwrite.o fputs.o \ - sleep.o usleep.o raise.o abort.o assert.o \ + sleep.o usleep.o raise.o abort.o assert.o alarm.o pause.o \ signal.o sigaction.o sigpending.o sigprocmask.o sigsuspend.o \ brk.o sbrk.o malloc.o free.o realloc.o calloc.o mmap.o \ memcpy.o memset.o memccpy.o memmem.o strcat.o strchr.o \ diff --git a/klibc/SYSCALLS b/klibc/SYSCALLS index f12bbdf416424..5439e4a60762e 100644 --- a/klibc/SYSCALLS +++ b/klibc/SYSCALLS @@ -102,9 +102,9 @@ int kill(pid_t, int) int rt_sigaction(int, const struct sigaction *, struct sigaction *, size_t) int rt_sigsuspend(const sigset_t *, size_t) int rt_sigpending(sigset_t *, size_t) -<!alpha> int pause() -<!alpha,ia64> unsigned int alarm(unsigned int) int rt_sigprocmask(int, const sigset_t *, sigset_t *, size_t) +int getitimer(int, struct itimerval *); +int setitimer(int, const struct itimerval *, struct itimerval *); # # Time-related system calls diff --git a/klibc/alarm.c b/klibc/alarm.c new file mode 100644 index 0000000000000..b4a1ff3c70e65 --- /dev/null +++ b/klibc/alarm.c @@ -0,0 +1,29 @@ +/* + * alarm.c + */ + +#include <sys/time.h> +#include <sys/syscall.h> + +#ifdef __NR_alarm + +_syscall1(unsigned int,alarm,unsigned int,seconds); + +#else + +/* Emulate alarm() via setitimer() */ + +unsigned int alarm(unsigned int seconds) +{ + struct itimerval iv; + + iv.it_interval.tv_sec = iv.it_interval.it_usec = 0; + iv.it_value.tv_sec = seconds; + iv.it_value.tv_usec = 0; + + setitimer(ITIMER_REAL, &iv, &iv); + + return iv.it_value.tv_sec + (iv.it_value.tv_usec ? 1 : 0); +} + +#endif diff --git a/klibc/pause.c b/klibc/pause.c new file mode 100644 index 0000000000000..57487284722ad --- /dev/null +++ b/klibc/pause.c @@ -0,0 +1,21 @@ +/* + * pause.c + */ + +#include <stddef.h> +#include <unistd.h> +#include <sys/time.h> +#include <sys/syscall.h> + +#ifdef __NR_pause + +_syscall0(int,pause); + +#else + +int pause(void) +{ + return select(0,NULL,NULL,NULL,NULL); +} + +#endif diff --git a/pause.c b/pause.c new file mode 100644 index 0000000000000..57487284722ad --- /dev/null +++ b/pause.c @@ -0,0 +1,21 @@ +/* + * pause.c + */ + +#include <stddef.h> +#include <unistd.h> +#include <sys/time.h> +#include <sys/syscall.h> + +#ifdef __NR_pause + +_syscall0(int,pause); + +#else + +int pause(void) +{ + return select(0,NULL,NULL,NULL,NULL); +} + +#endif |