added locking around ring_buffer_user_read as suggested by axeld. locking is already around ring_buffer_write
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18399 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -624,7 +624,7 @@ usb_callback(void *cookie, uint32 busStatus,
|
|||||||
} else
|
} else
|
||||||
interpret_mouse_buffer(device);
|
interpret_mouse_buffer(device);
|
||||||
|
|
||||||
release_sem (device->sem_lock);
|
release_sem(device->sem_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* issue next request */
|
/* issue next request */
|
||||||
@@ -870,12 +870,12 @@ hid_device_open(const char *name, uint32 flags,
|
|||||||
if ((cookie = malloc (sizeof (driver_cookie))) == NULL)
|
if ((cookie = malloc (sizeof (driver_cookie))) == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
acquire_sem (device->sem_lock);
|
acquire_sem(device->sem_lock);
|
||||||
cookie->device = device;
|
cookie->device = device;
|
||||||
cookie->next = device->open_fds;
|
cookie->next = device->open_fds;
|
||||||
device->open_fds = cookie;
|
device->open_fds = cookie;
|
||||||
device->open++;
|
device->open++;
|
||||||
release_sem (device->sem_lock);
|
release_sem(device->sem_lock);
|
||||||
|
|
||||||
*out_cookie = cookie;
|
*out_cookie = cookie;
|
||||||
DPRINTF_INFO ((MY_ID "device %s open (%d)\n", name, device->open));
|
DPRINTF_INFO ((MY_ID "device %s open (%d)\n", name, device->open));
|
||||||
@@ -920,7 +920,9 @@ hid_device_control(driver_cookie *cookie, uint32 op,
|
|||||||
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
|
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
|
||||||
if (err != B_OK)
|
if (err != B_OK)
|
||||||
return err;
|
return err;
|
||||||
|
acquire_sem(device->sem_lock);
|
||||||
ring_buffer_user_read(device->rbuf, arg, sizeof(raw_key_info));
|
ring_buffer_user_read(device->rbuf, arg, sizeof(raw_key_info));
|
||||||
|
release_sem(device->sem_lock);
|
||||||
return err;
|
return err;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -934,7 +936,9 @@ hid_device_control(driver_cookie *cookie, uint32 op,
|
|||||||
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
|
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
|
||||||
if (err != B_OK)
|
if (err != B_OK)
|
||||||
return err;
|
return err;
|
||||||
|
acquire_sem(device->sem_lock);
|
||||||
ring_buffer_user_read(device->rbuf, arg, sizeof(mouse_movement));
|
ring_buffer_user_read(device->rbuf, arg, sizeof(mouse_movement));
|
||||||
|
release_sem(device->sem_lock);
|
||||||
return err;
|
return err;
|
||||||
break;
|
break;
|
||||||
case MS_NUM_EVENTS:
|
case MS_NUM_EVENTS:
|
||||||
@@ -964,7 +968,7 @@ hid_device_close(driver_cookie *cookie)
|
|||||||
|
|
||||||
/* detach the cookie from list */
|
/* detach the cookie from list */
|
||||||
|
|
||||||
acquire_sem (device->sem_lock);
|
acquire_sem(device->sem_lock);
|
||||||
if (device->open_fds == cookie)
|
if (device->open_fds == cookie)
|
||||||
device->open_fds = cookie->next;
|
device->open_fds = cookie->next;
|
||||||
else {
|
else {
|
||||||
@@ -977,7 +981,7 @@ hid_device_close(driver_cookie *cookie)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
--device->open;
|
--device->open;
|
||||||
release_sem (device->sem_lock);
|
release_sem(device->sem_lock);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user