diff options
-rw-r--r-- | include/mingw.h | 10 | ||||
-rw-r--r-- | win32/mingw.c | 124 |
2 files changed, 1 insertions, 133 deletions
diff --git a/include/mingw.h b/include/mingw.h index 005c17d14..c15161483 100644 --- a/include/mingw.h +++ b/include/mingw.h | |||
@@ -123,13 +123,11 @@ struct sigaction { | |||
123 | #define sigemptyset(x) (void)0 | 123 | #define sigemptyset(x) (void)0 |
124 | #define SA_RESTART 0 | 124 | #define SA_RESTART 0 |
125 | 125 | ||
126 | int sigaction(int sig, struct sigaction *in, struct sigaction *out); | 126 | NOIMPL(sigaction,int sig UNUSED_PARAM, struct sigaction *in UNUSED_PARAM, struct sigaction *out UNUSED_PARAM); |
127 | sighandler_t mingw_signal(int sig, sighandler_t handler); | ||
128 | NOIMPL(sigfillset,int *mask UNUSED_PARAM); | 127 | NOIMPL(sigfillset,int *mask UNUSED_PARAM); |
129 | NOIMPL(FAST_FUNC sigprocmask_allsigs, int how UNUSED_PARAM); | 128 | NOIMPL(FAST_FUNC sigprocmask_allsigs, int how UNUSED_PARAM); |
130 | NOIMPL(FAST_FUNC sigaction_set,int signo UNUSED_PARAM, const struct sigaction *sa UNUSED_PARAM); | 129 | NOIMPL(FAST_FUNC sigaction_set,int signo UNUSED_PARAM, const struct sigaction *sa UNUSED_PARAM); |
131 | 130 | ||
132 | #define signal mingw_signal | ||
133 | /* | 131 | /* |
134 | * stdio.h | 132 | * stdio.h |
135 | */ | 133 | */ |
@@ -342,12 +340,6 @@ struct timespec { | |||
342 | long int tv_nsec; | 340 | long int tv_nsec; |
343 | }; | 341 | }; |
344 | #endif | 342 | #endif |
345 | struct itimerval { | ||
346 | struct timeval it_value, it_interval; | ||
347 | }; | ||
348 | #define ITIMER_REAL 0 | ||
349 | |||
350 | int setitimer(int type, struct itimerval *in, struct itimerval *out); | ||
351 | 343 | ||
352 | /* | 344 | /* |
353 | * sys/wait.h | 345 | * sys/wait.h |
diff --git a/win32/mingw.c b/win32/mingw.c index 6b63e2487..14cfdd992 100644 --- a/win32/mingw.c +++ b/win32/mingw.c | |||
@@ -707,130 +707,6 @@ clock_t times(struct tms *buf) | |||
707 | return 0; | 707 | return 0; |
708 | } | 708 | } |
709 | 709 | ||
710 | static HANDLE timer_event; | ||
711 | static HANDLE timer_thread; | ||
712 | static int timer_interval; | ||
713 | static int one_shot; | ||
714 | static sighandler_t timer_fn = SIG_DFL; | ||
715 | |||
716 | /* The timer works like this: | ||
717 | * The thread, ticktack(), is a trivial routine that most of the time | ||
718 | * only waits to receive the signal to terminate. The main thread tells | ||
719 | * the thread to terminate by setting the timer_event to the signalled | ||
720 | * state. | ||
721 | * But ticktack() interrupts the wait state after the timer's interval | ||
722 | * length to call the signal handler. | ||
723 | */ | ||
724 | |||
725 | static __stdcall unsigned ticktack(void *dummy UNUSED_PARAM) | ||
726 | { | ||
727 | while (WaitForSingleObject(timer_event, timer_interval) == WAIT_TIMEOUT) { | ||
728 | if (timer_fn == SIG_DFL) | ||
729 | bb_error_msg_and_die("Alarm"); | ||
730 | if (timer_fn != SIG_IGN) | ||
731 | timer_fn(SIGALRM); | ||
732 | if (one_shot) | ||
733 | break; | ||
734 | } | ||
735 | return 0; | ||
736 | } | ||
737 | |||
738 | static int start_timer_thread(void) | ||
739 | { | ||
740 | timer_event = CreateEvent(NULL, FALSE, FALSE, NULL); | ||
741 | if (timer_event) { | ||
742 | timer_thread = (HANDLE) _beginthreadex(NULL, 0, ticktack, NULL, 0, NULL); | ||
743 | if (!timer_thread ) { | ||
744 | errno = ENOMEM; | ||
745 | return -1; | ||
746 | } | ||
747 | } else { | ||
748 | errno = ENOMEM; | ||
749 | return -1; | ||
750 | } | ||
751 | return 0; | ||
752 | } | ||
753 | |||
754 | static void stop_timer_thread(void) | ||
755 | { | ||
756 | if (timer_event) | ||
757 | SetEvent(timer_event); /* tell thread to terminate */ | ||
758 | if (timer_thread) { | ||
759 | int rc = WaitForSingleObject(timer_thread, 1000); | ||
760 | if (rc == WAIT_TIMEOUT) | ||
761 | fprintf(stderr, "timer thread did not terminate timely"); | ||
762 | else if (rc != WAIT_OBJECT_0) | ||
763 | fprintf(stderr, "waiting for timer thread failed: %lu", | ||
764 | GetLastError()); | ||
765 | CloseHandle(timer_thread); | ||
766 | } | ||
767 | if (timer_event) | ||
768 | CloseHandle(timer_event); | ||
769 | timer_event = NULL; | ||
770 | timer_thread = NULL; | ||
771 | } | ||
772 | |||
773 | static inline int is_timeval_eq(const struct timeval *i1, const struct timeval *i2) | ||
774 | { | ||
775 | return i1->tv_sec == i2->tv_sec && i1->tv_usec == i2->tv_usec; | ||
776 | } | ||
777 | |||
778 | int setitimer(int type UNUSED_PARAM, struct itimerval *in, struct itimerval *out) | ||
779 | { | ||
780 | static const struct timeval zero; | ||
781 | static int atexit_done; | ||
782 | |||
783 | if (out != NULL) { | ||
784 | errno = EINVAL; | ||
785 | return -1; | ||
786 | } | ||
787 | if (!is_timeval_eq(&in->it_interval, &zero) && | ||
788 | !is_timeval_eq(&in->it_interval, &in->it_value)) { | ||
789 | errno = EINVAL; | ||
790 | return -1; | ||
791 | } | ||
792 | |||
793 | if (timer_thread) | ||
794 | stop_timer_thread(); | ||
795 | |||
796 | if (is_timeval_eq(&in->it_value, &zero) && | ||
797 | is_timeval_eq(&in->it_interval, &zero)) | ||
798 | return 0; | ||
799 | |||
800 | timer_interval = in->it_value.tv_sec * 1000 + in->it_value.tv_usec / 1000; | ||
801 | one_shot = is_timeval_eq(&in->it_interval, &zero); | ||
802 | if (!atexit_done) { | ||
803 | atexit(stop_timer_thread); | ||
804 | atexit_done = 1; | ||
805 | } | ||
806 | return start_timer_thread(); | ||
807 | } | ||
808 | |||
809 | int sigaction(int sig, struct sigaction *in, struct sigaction *out) | ||
810 | { | ||
811 | if (sig != SIGALRM) { | ||
812 | errno = EINVAL; | ||
813 | return -1; | ||
814 | } | ||
815 | if (out != NULL) { | ||
816 | errno = EINVAL; | ||
817 | return -1; | ||
818 | } | ||
819 | |||
820 | timer_fn = in->sa_handler; | ||
821 | return 0; | ||
822 | } | ||
823 | |||
824 | #undef signal | ||
825 | sighandler_t mingw_signal(int sig, sighandler_t handler) | ||
826 | { | ||
827 | sighandler_t old = timer_fn; | ||
828 | if (sig != SIGALRM) | ||
829 | return signal(sig, handler); | ||
830 | timer_fn = handler; | ||
831 | return old; | ||
832 | } | ||
833 | |||
834 | int link(const char *oldpath, const char *newpath) | 710 | int link(const char *oldpath, const char *newpath) |
835 | { | 711 | { |
836 | typedef BOOL (WINAPI *T)(const char*, const char*, LPSECURITY_ATTRIBUTES); | 712 | typedef BOOL (WINAPI *T)(const char*, const char*, LPSECURITY_ATTRIBUTES); |