diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-05-20 16:23:38 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-05-22 15:44:03 +1000 |
commit | add2defac7e59dcb355e5ba12b6de60861741d57 (patch) | |
tree | d519a5b4d0e63ab7f5bd0f34fab5d25eca0fae5a | |
parent | 73c7398aafa050950ad614483fb0d5bdd2da97ca (diff) |
Split the signal-handler's lastSlave out into a separate variable.
dev->u.lastSlave was not signal safe since it was accessed by the DIX and
during signal handling.
Replaced with:
'dev->last.slave' for the signal handler's lastSlave (used to generate
DeviceChangedEvents), .
'dev->u.lastSlave' for the DIX lastSlave (currently only used in
change_modmap)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | Xi/exevents.c | 1 | ||||
-rw-r--r-- | dix/devices.c | 14 | ||||
-rw-r--r-- | dix/getevents.c | 10 | ||||
-rw-r--r-- | include/inputstr.h | 1 | ||||
-rw-r--r-- | mi/mieq.c | 3 |
5 files changed, 23 insertions, 6 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c index 777202965..04a4fbd0c 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1010,7 +1010,6 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device) if (device->isMaster || !device->u.master) CheckMotion(event, device); - switch (event->type) { case ET_Motion: diff --git a/dix/devices.c b/dix/devices.c index ff91608a8..e7da2ad1d 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -433,6 +433,18 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent) (void)(*dev->deviceProc)(dev, DEVICE_OFF); dev->enabled = FALSE; + + /* now that the device is disabled, we can reset the signal handler's + * last.slave */ + OsBlockSignals(); + for (other = inputInfo.devices; other; other = other->next) + { + if (other->last.slave == dev) + other->last.slave = NULL; + } + OsReleaseSignals(); + + *prev = dev->next; dev->next = inputInfo.off_devices; inputInfo.off_devices = dev; @@ -2367,6 +2379,7 @@ AllocDevicePair (ClientPtr client, char* name, pointer->spriteInfo->spriteOwner = TRUE; pointer->u.lastSlave = NULL; + pointer->last.slave = NULL; pointer->isMaster = master; keyboard = AddInputDevice(client, CoreKeyboardProc, TRUE); @@ -2389,6 +2402,7 @@ AllocDevicePair (ClientPtr client, char* name, keyboard->spriteInfo->spriteOwner = FALSE; keyboard->u.lastSlave = NULL; + keyboard->last.slave = NULL; keyboard->isMaster = master; diff --git a/dix/getevents.c b/dix/getevents.c index 652bd6758..e40b3dbe9 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -199,10 +199,10 @@ CreateClassesChangedEvent(EventList* event, dce->length = sizeof(DeviceChangedEvent); dce->type = ET_DeviceChanged; dce->time = ms; - if (master->u.lastSlave) + if (master->last.slave) { dce->flags |= DEVCHANGE_HAS_OLD_SLAVE; - dce->old_slaveid = master->u.lastSlave->id; + dce->old_slaveid = master->last.slave->id; } dce->flags |= DEVCHANGE_HAS_NEW_SLAVE; dce->new_slaveid = slave->id; @@ -294,7 +294,7 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev) * slave-device. If the old slave had less axes than this one, * last.valuators is reset to 0. */ - if ((lastSlave = master->u.lastSlave) && lastSlave->valuator) { + if ((lastSlave = master->last.slave) && lastSlave->valuator) { for (i = 2; i < pDev->valuator->numAxes; i++) { if (i >= lastSlave->valuator->numAxes) pDev->last.valuators[i] = 0; @@ -612,11 +612,11 @@ static EventListPtr updateFromMaster(EventListPtr events, DeviceIntPtr dev, int *num_events) { DeviceIntPtr master = dev->u.master; - if (master && master->u.lastSlave != dev) + if (master && master->last.slave != dev) { CreateClassesChangedEvent(events, master, dev); updateSlaveDeviceCoords(master, dev); - master->u.lastSlave = dev; + master->last.slave = dev; master->last.numValuators = dev->last.numValuators; (*num_events)++; events++; diff --git a/include/inputstr.h b/include/inputstr.h index 0a541a714..0fd348812 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -507,6 +507,7 @@ typedef struct _DeviceIntRec { int valuators[MAX_VALUATORS]; float remainder[MAX_VALUATORS]; int numValuators; + DeviceIntPtr slave; } last; /* Input device property handling. */ @@ -370,8 +370,11 @@ mieqProcessDeviceEvent(DeviceIntPtr dev, { handler(DequeueScreen(dev)->myNum, event, dev); if (master) + { + master->u.lastSlave = dev; handler(DequeueScreen(master)->myNum, (InternalEvent*)masterEvents->event, master); + } } else { /* process slave first, then master */ |