ape: an implemenation of getitimer setitimer
This commit is contained in:
parent
9dc907361c
commit
91d0343627
5 changed files with 103 additions and 2 deletions
|
@ -37,9 +37,11 @@ typedef int sig_atomic_t;
|
||||||
#define SIGTSTP 18 /* interactive stop */
|
#define SIGTSTP 18 /* interactive stop */
|
||||||
#define SIGTTIN 19 /* read from ctl tty by member of background */
|
#define SIGTTIN 19 /* read from ctl tty by member of background */
|
||||||
#define SIGTTOU 20 /* write to ctl tty by member of background */
|
#define SIGTTOU 20 /* write to ctl tty by member of background */
|
||||||
|
#define SIGVTALRM 21 /* virtual alarm clock */
|
||||||
|
#define SIGPROF 22 /* profiling alarm clock */
|
||||||
|
|
||||||
#ifdef _BSD_EXTENSION
|
#ifdef _BSD_EXTENSION
|
||||||
#define NSIG 21
|
#define NSIG 23
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -9,6 +9,11 @@ struct timeval {
|
||||||
long tv_usec;
|
long tv_usec;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct itimerval {
|
||||||
|
struct timeval it_interval;
|
||||||
|
struct timeval it_value;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef _BSD_EXTENSION
|
#ifdef _BSD_EXTENSION
|
||||||
struct timezone {
|
struct timezone {
|
||||||
int tz_minuteswest;
|
int tz_minuteswest;
|
||||||
|
@ -17,6 +22,12 @@ struct timezone {
|
||||||
#endif
|
#endif
|
||||||
#endif /* __TIMEVAL__ */
|
#endif /* __TIMEVAL__ */
|
||||||
|
|
||||||
|
#define ITIMER_REAL 0
|
||||||
|
#define ITIMER_VIRTUAL 1
|
||||||
|
#define ITIMER_PROF 3
|
||||||
|
|
||||||
extern int gettimeofday(struct timeval *, struct timezone *);
|
extern int gettimeofday(struct timeval *, struct timezone *);
|
||||||
|
int getitimer(int, struct itimerval *);
|
||||||
|
int setitimer(int, const struct itimerval *, struct itimerval *);
|
||||||
|
|
||||||
#endif /* __SYSTIME_H */
|
#endif /* __SYSTIME_H */
|
||||||
|
|
|
@ -28,10 +28,11 @@ static struct {
|
||||||
{"sys: trap: address error", SIGSEGV},
|
{"sys: trap: address error", SIGSEGV},
|
||||||
{"sys: trap: TLB", SIGSEGV},
|
{"sys: trap: TLB", SIGSEGV},
|
||||||
{"sys: write on closed pipe", SIGPIPE},
|
{"sys: write on closed pipe", SIGPIPE},
|
||||||
{"alarm", SIGALRM},
|
|
||||||
{"term", SIGTERM},
|
{"term", SIGTERM},
|
||||||
{"usr1", SIGUSR1},
|
{"usr1", SIGUSR1},
|
||||||
{"usr2", SIGUSR2},
|
{"usr2", SIGUSR2},
|
||||||
|
{"virtual alarm", SIGVTALRM},
|
||||||
|
{"profiling alarm", SIGPROF},
|
||||||
};
|
};
|
||||||
#define NSIGTAB ((sizeof sigtab)/(sizeof (sigtab[0])))
|
#define NSIGTAB ((sizeof sigtab)/(sizeof (sigtab[0])))
|
||||||
|
|
||||||
|
|
86
sys/src/ape/lib/bsd/getitimer.c
Normal file
86
sys/src/ape/lib/bsd/getitimer.c
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct Timer Timer;
|
||||||
|
struct Timer {
|
||||||
|
int pid, signal;
|
||||||
|
struct itimerval itimer;
|
||||||
|
};
|
||||||
|
|
||||||
|
Timer timers[3] = {
|
||||||
|
{0, SIGALRM},
|
||||||
|
{0, SIGVTALRM},
|
||||||
|
{0, SIGPROF},
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
timerloop(Timer *timer, const struct timeval tval)
|
||||||
|
{
|
||||||
|
pid_t ppid;
|
||||||
|
struct timespec t, s;
|
||||||
|
|
||||||
|
ppid = getppid();
|
||||||
|
t.tv_sec = tval.tv_sec;
|
||||||
|
t.tv_nsec = tval.tv_usec*1000;
|
||||||
|
for(;;){
|
||||||
|
nanosleep(&t, &s);
|
||||||
|
kill(ppid, timer->signal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
setitimer(int which, const struct itimerval *new, struct itimerval *curr)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
int status;
|
||||||
|
Timer *timer;
|
||||||
|
|
||||||
|
if(which < 0 || which >= 3){
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
timer = timers+which;
|
||||||
|
if(timer->pid != 0){
|
||||||
|
kill(timer->pid, SIGKILL);
|
||||||
|
waitpid(timer->pid, &status, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(pid = fork()){
|
||||||
|
default:
|
||||||
|
timer->pid = pid;
|
||||||
|
if(curr != NULL)
|
||||||
|
*curr = timer->itimer;
|
||||||
|
timer->itimer = *new;
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
errno = EFAULT;
|
||||||
|
return -1;
|
||||||
|
case 0:
|
||||||
|
timerloop(timer, new->it_interval);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
getitimer(int which, struct itimerval *curr)
|
||||||
|
{
|
||||||
|
Timer *timer;
|
||||||
|
|
||||||
|
if(which < 0 || which >= 3){
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
timer = timers+which;
|
||||||
|
*curr = timer->itimer;
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ OFILES=\
|
||||||
gethostbyaddr.$O\
|
gethostbyaddr.$O\
|
||||||
gethostbyname.$O\
|
gethostbyname.$O\
|
||||||
gethostname.$O\
|
gethostname.$O\
|
||||||
|
getitimer.$O\
|
||||||
getnameinfo.$O\
|
getnameinfo.$O\
|
||||||
getopt.$O\
|
getopt.$O\
|
||||||
getpeername.$O\
|
getpeername.$O\
|
||||||
|
|
Loading…
Reference in a new issue