X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=support%2Fsignal.c;h=a635dd485edc000625353e8c034b90370361845a;hb=ce7427cacf3126bc0721e709ba1901cc97a4cf6b;hp=8a2e761c38f2e079a643b45a8fd7245be0828899;hpb=57b521e048ba4a301bc21f1c5d5833dd7f2b6bb9;p=mono.git diff --git a/support/signal.c b/support/signal.c index 8a2e761c38f..a635dd485ed 100644 --- a/support/signal.c +++ b/support/signal.c @@ -15,15 +15,20 @@ #include "map.h" #include "mph.h" -#ifndef PLATFORM_WIN32 +#ifndef HOST_WIN32 #include #include +#if defined(__APPLE__) +#include "fakepoll.h" +#else #include +#endif #include #include #include #include #include +#include #endif G_BEGIN_DECLS @@ -31,7 +36,9 @@ G_BEGIN_DECLS typedef void (*mph_sighandler_t)(int); typedef struct Mono_Unix_UnixSignal_SignalInfo signal_info; +#ifndef HOST_WIN32 static int count_handlers (int signum); +#endif void* Mono_Posix_Stdlib_SIG_DFL (void) @@ -98,7 +105,7 @@ int Mono_Posix_FromRealTimeSignum (int offset, int *r) #endif /* defined (SIGRTMIN) && defined (SIGRTMAX) */ } -#ifndef PLATFORM_WIN32 +#ifndef HOST_WIN32 #ifdef WAPI_ATOMIC_ASM #define mph_int_get(p) InterlockedExchangeAdd ((p), 0) @@ -119,6 +126,7 @@ int Mono_Posix_FromRealTimeSignum (int offset, int *r) #define mph_int_set(p,o,n) do { *(p) = n; } while (0) #endif +#if HAVE_PSIGNAL int Mono_Posix_Syscall_psignal (int sig, const char* s) { @@ -126,6 +134,7 @@ Mono_Posix_Syscall_psignal (int sig, const char* s) psignal (sig, s); return errno == 0 ? 0 : -1; } +#endif /* def HAVE_PSIGNAL */ #define NUM_SIGNALS 64 static signal_info signals[NUM_SIGNALS]; @@ -151,6 +160,12 @@ static void release_mutex (pthread_mutex_t *mutex) } } +static inline int +keep_trying (int r) +{ + return r == -1 && errno == EINTR; +} + static void default_handler (int signum) { @@ -168,7 +183,7 @@ default_handler (int signum) pipecounter = mph_int_get (&h->pipecnt); for (j = 0; j < pipecounter; ++j) { int r; - do { r = write (fd, &c, 1); } while (r == -1 && errno == EINTR); + do { r = write (fd, &c, 1); } while (keep_trying (r)); fsync (fd); /* force */ } } @@ -326,7 +341,7 @@ teardown_pipes (signal_info** signals, int count) } static int -wait_for_any (signal_info** signals, int count, int *currfd, struct pollfd* fd_structs, int timeout) +wait_for_any (signal_info** signals, int count, int *currfd, struct pollfd* fd_structs, int timeout, Mono_Posix_RuntimeIsShuttingDown shutting_down) { int r, idx; do { @@ -338,7 +353,7 @@ wait_for_any (signal_info** signals, int count, int *currfd, struct pollfd* fd_s ptv = &tv; } r = poll (fd_structs, count, timeout); - } while (r == -1 && errno == EINTR); + } while (keep_trying (r) && !shutting_down ()); idx = -1; if (r == 0) @@ -352,7 +367,7 @@ wait_for_any (signal_info** signals, int count, int *currfd, struct pollfd* fd_s char c; do { r = read (h->read_fd, &c, 1); - } while (r == -1 && errno == EINTR); + } while (keep_trying (r) && !shutting_down ()); if (idx == -1) idx = i; } @@ -368,7 +383,7 @@ wait_for_any (signal_info** signals, int count, int *currfd, struct pollfd* fd_s * index into _signals array of signal that was generated on success */ int -Mono_Unix_UnixSignal_WaitAny (void** _signals, int count, int timeout /* milliseconds */) +Mono_Unix_UnixSignal_WaitAny (void** _signals, int count, int timeout /* milliseconds */, Mono_Posix_RuntimeIsShuttingDown shutting_down) { int r; int currfd = 0; @@ -387,7 +402,7 @@ Mono_Unix_UnixSignal_WaitAny (void** _signals, int count, int timeout /* millise release_mutex (&signals_mutex); if (r == 0) { - r = wait_for_any (signals, count, &currfd, &fd_structs[0], timeout); + r = wait_for_any (signals, count, &currfd, &fd_structs[0], timeout, shutting_down); } if (acquire_mutex (&signals_mutex) == -1) @@ -400,7 +415,7 @@ Mono_Unix_UnixSignal_WaitAny (void** _signals, int count, int timeout /* millise return r; } -#endif /* ndef PLATFORM_WIN32 */ +#endif /* ndef HOST_WIN32 */ G_END_DECLS