Merge remote-tracking branch 'whot/for-keith'

This commit is contained in:
Keith Packard 2012-08-06 16:52:12 -07:00
commit 02f94b2d44
3 changed files with 43 additions and 8 deletions

View File

@ -1625,6 +1625,8 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
if (adj != 0.0 && axis != -1) {
adj *= pDev->valuator->axes[axis].scroll.increment;
if (!valuator_mask_isset(&mask, axis))
valuator_mask_set(&mask, axis, 0);
add_to_scroll_valuator(pDev, &mask, axis, adj);
type = MotionNotify;
buttons = 0;

View File

@ -1186,6 +1186,7 @@ OsBlockSignals(void)
#ifdef SIG_BLOCK
static sig_atomic_t sigio_blocked;
static sigset_t PreviousSigIOMask;
#endif
/**
@ -1198,13 +1199,13 @@ OsBlockSIGIO(void)
#ifdef SIGIO
#ifdef SIG_BLOCK
if (sigio_blocked++ == 0) {
sigset_t set, old;
sigset_t set;
int ret;
sigemptyset(&set);
sigaddset(&set, SIGIO);
sigprocmask(SIG_BLOCK, &set, &old);
ret = sigismember(&old, SIGIO);
sigprocmask(SIG_BLOCK, &set, &PreviousSigIOMask);
ret = sigismember(&PreviousSigIOMask, SIGIO);
return ret;
} else
return 1;
@ -1218,11 +1219,7 @@ OsReleaseSIGIO(void)
#ifdef SIGIO
#ifdef SIG_BLOCK
if (--sigio_blocked == 0) {
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGIO);
sigprocmask(SIG_UNBLOCK, &set, NULL);
sigprocmask(SIG_SETMASK, &PreviousSigIOMask, 0);
} else if (sigio_blocked < 0) {
BUG_WARN(sigio_blocked < 0);
sigio_blocked = 0;

View File

@ -28,6 +28,21 @@
#include <signal.h>
#include "os.h"
static int last_signal = 0;
static int expect_signal = 0;
static void sighandler(int signal)
{
assert(expect_signal);
expect_signal = 0;
if (!last_signal)
raise(signal);
OsBlockSignals();
OsReleaseSignals();
last_signal = 1;
expect_signal = 1;
}
static int
sig_is_blocked(int sig)
{
@ -118,7 +133,27 @@ static void block_sigio_test(void)
assert(sig_is_blocked(SIGIO));
OsReleaseSignals();
assert(!sig_is_blocked(SIGIO));
#endif
}
static void block_sigio_test_nested(void)
{
#ifdef SIG_BLOCK
/* Check for bug releasing SIGIO during SIGIO signal handling.
test case:
raise signal
in signal handler:
raise signal
OsBlockSignals()
OsReleaseSignals()
tail guard
tail guard must be hit.
*/
sighandler_t old_handler;
old_handler = signal(SIGIO, sighandler);
expect_signal = 1;
assert(raise(SIGIO) == 0);
assert(signal(SIGIO, old_handler) == sighandler);
#endif
}
@ -126,5 +161,6 @@ int
main(int argc, char **argv)
{
block_sigio_test();
block_sigio_test_nested();
return 0;
}