00001
00002
00003
00004
00005
00006
00007
00008 #include <lib.h>
00009 #define sleep _sleep
00010 #include <signal.h>
00011 #include <unistd.h>
00012 #include <time.h>
00013
00014 static void handler(int sig)
00015 {
00016
00017 }
00018
00019 unsigned sleep(unsigned sleep_seconds)
00020 {
00021 sigset_t ss_full, ss_orig, ss_alarm;
00022 struct sigaction action_alarm, action_orig;
00023 unsigned alarm_seconds, nap_seconds;
00024
00025 if (sleep_seconds == 0) return 0;
00026
00027
00028 sigfillset(&ss_full);
00029 sigprocmask(SIG_BLOCK, &ss_full, &ss_orig);
00030
00031
00032 alarm_seconds= alarm(0);
00033
00034
00035 nap_seconds= sleep_seconds;
00036 if (alarm_seconds != 0 && alarm_seconds < sleep_seconds) {
00037 nap_seconds= alarm_seconds;
00038 }
00039
00040
00041 action_alarm.sa_handler= handler;
00042 sigemptyset(&action_alarm.sa_mask);
00043 action_alarm.sa_flags= 0;
00044 sigaction(SIGALRM, &action_alarm, &action_orig);
00045 alarm(nap_seconds);
00046
00047
00048 ss_alarm= ss_orig;
00049 sigdelset(&ss_alarm, SIGALRM);
00050 sigsuspend(&ss_alarm);
00051
00052
00053 nap_seconds -= alarm(0);
00054 sigaction(SIGALRM, &action_orig, NULL);
00055 sigprocmask(SIG_SETMASK, &ss_orig, NULL);
00056
00057
00058 if (alarm_seconds != 0 && alarm_seconds >= nap_seconds) {
00059 alarm_seconds -= nap_seconds;
00060 if (alarm_seconds == 0) {
00061 raise(SIGALRM);
00062 } else {
00063 alarm(alarm_seconds);
00064 }
00065 }
00066
00067
00068 return sleep_seconds - nap_seconds;
00069 }