From: Julian Seward Date: Sat, 13 Jul 2002 11:05:45 +0000 (+0000) Subject: Make sigsuspend() work well enough to keep zsh hackers happy. X-Git-Tag: svn/VALGRIND_1_0_3~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4ea574f4f0a690e4da1b2601302e96da25b3430f;p=thirdparty%2Fvalgrind.git Make sigsuspend() work well enough to keep zsh hackers happy. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@489 --- diff --git a/coregrind/vg_clientfuncs.c b/coregrind/vg_clientfuncs.c index ee4cf38e36..9e498e0518 100644 --- a/coregrind/vg_clientfuncs.c +++ b/coregrind/vg_clientfuncs.c @@ -499,6 +499,59 @@ void* memcpy( void *dst, const void *src, unsigned int len ) return dst; } + +/* --------------------------------------------------------------------- + Horrible hack to make sigsuspend() sort-of work OK. Same trick as + for pause() in vg_libpthread.so. + ------------------------------------------------------------------ */ + +/* Horrible because + + -- uses VG_(ksigprocmask), VG_(nanosleep) and vg_assert, which are + valgrind-native (not intended for client use). + + -- This is here so single-threaded progs (not linking libpthread.so) + can see it. But pause() should also be here. ??? +*/ + +/* Either libc supplies this (weak) or our libpthread.so supplies it + (strong) in a threaded setting. +*/ +extern int* __errno_location ( void ); + + +int sigsuspend ( /* const sigset_t * */ void* mask) +{ + unsigned int n_orig, n_now; + struct vki_timespec nanosleep_interval; + + VALGRIND_MAGIC_SEQUENCE(n_orig, 0xFFFFFFFF /* default */, + VG_USERREQ__GET_N_SIGS_RETURNED, + 0, 0, 0, 0); + vg_assert(n_orig != 0xFFFFFFFF); + + VG_(ksigprocmask)(VKI_SIG_SETMASK, mask, NULL); + + while (1) { + VALGRIND_MAGIC_SEQUENCE(n_now, 0xFFFFFFFF /* default */, + VG_USERREQ__GET_N_SIGS_RETURNED, + 0, 0, 0, 0); + vg_assert(n_now != 0xFFFFFFFF); + vg_assert(n_now >= n_orig); + if (n_now != n_orig) break; + + nanosleep_interval.tv_sec = 0; + nanosleep_interval.tv_nsec = 53 * 1000 * 1000; /* 53 milliseconds */ + /* It's critical here that valgrind's nanosleep implementation + is nonblocking. */ + VG_(nanosleep)( &nanosleep_interval, NULL); + } + + /* Maybe this is OK both in single and multithreaded setting. */ + * (__errno_location()) = -VKI_EINTR; /* == EINTR; */ + return -1; +} + /*--------------------------------------------------------------------*/ /*--- end vg_clientfuncs.c ---*/ /*--------------------------------------------------------------------*/ diff --git a/vg_clientfuncs.c b/vg_clientfuncs.c index ee4cf38e36..9e498e0518 100644 --- a/vg_clientfuncs.c +++ b/vg_clientfuncs.c @@ -499,6 +499,59 @@ void* memcpy( void *dst, const void *src, unsigned int len ) return dst; } + +/* --------------------------------------------------------------------- + Horrible hack to make sigsuspend() sort-of work OK. Same trick as + for pause() in vg_libpthread.so. + ------------------------------------------------------------------ */ + +/* Horrible because + + -- uses VG_(ksigprocmask), VG_(nanosleep) and vg_assert, which are + valgrind-native (not intended for client use). + + -- This is here so single-threaded progs (not linking libpthread.so) + can see it. But pause() should also be here. ??? +*/ + +/* Either libc supplies this (weak) or our libpthread.so supplies it + (strong) in a threaded setting. +*/ +extern int* __errno_location ( void ); + + +int sigsuspend ( /* const sigset_t * */ void* mask) +{ + unsigned int n_orig, n_now; + struct vki_timespec nanosleep_interval; + + VALGRIND_MAGIC_SEQUENCE(n_orig, 0xFFFFFFFF /* default */, + VG_USERREQ__GET_N_SIGS_RETURNED, + 0, 0, 0, 0); + vg_assert(n_orig != 0xFFFFFFFF); + + VG_(ksigprocmask)(VKI_SIG_SETMASK, mask, NULL); + + while (1) { + VALGRIND_MAGIC_SEQUENCE(n_now, 0xFFFFFFFF /* default */, + VG_USERREQ__GET_N_SIGS_RETURNED, + 0, 0, 0, 0); + vg_assert(n_now != 0xFFFFFFFF); + vg_assert(n_now >= n_orig); + if (n_now != n_orig) break; + + nanosleep_interval.tv_sec = 0; + nanosleep_interval.tv_nsec = 53 * 1000 * 1000; /* 53 milliseconds */ + /* It's critical here that valgrind's nanosleep implementation + is nonblocking. */ + VG_(nanosleep)( &nanosleep_interval, NULL); + } + + /* Maybe this is OK both in single and multithreaded setting. */ + * (__errno_location()) = -VKI_EINTR; /* == EINTR; */ + return -1; +} + /*--------------------------------------------------------------------*/ /*--- end vg_clientfuncs.c ---*/ /*--------------------------------------------------------------------*/