* applied the same logic with regards to the ringbuffer to the

mouse case in the ioctl() hook. Should be considered work in progress.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23330 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2008-01-09 21:26:05 +00:00
parent 2db1814b1f
commit 6e796d9fbe
+24 -26
View File
@@ -924,7 +924,7 @@ hid_device_control(driver_cookie *cookie, uint32 op,
if (!device->active) if (!device->active)
return B_ERROR; /* already unplugged */ return B_ERROR; /* already unplugged */
if (device->is_keyboard) if (device->is_keyboard) {
switch (op) { switch (op) {
case KB_READ: case KB_READ:
while (ring_buffer_readable(device->rbuf) == 0) { while (ring_buffer_readable(device->rbuf) == 0) {
@@ -969,36 +969,33 @@ hid_device_control(driver_cookie *cookie, uint32 op,
set_leds(device, (uint8 *)arg); set_leds(device, (uint8 *)arg);
break; break;
} }
else } else {
switch (op) { switch (op) {
case MS_READ: case MS_READ:
err = schedule_interrupt_transfer(device); while (ring_buffer_readable(device->rbuf) == 0) {
if (err != B_OK) err = schedule_interrupt_transfer(device);
return err; if (err != B_OK)
// NOTE: this thread is now blocking until return err;
// the semaphore will be released from the // NOTE: this thread is now blocking until
// call_back function // the semaphore will be released from the
// call_back function
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
if (err != B_OK)
return err;
err = handle_interrupt_transfer(device);
if (err != B_OK)
return err;
}
err = acquire_sem_etc(device->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
if (err != B_OK)
return err;
err = handle_interrupt_transfer(device);
if (err != B_OK)
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 B_OK;
return err;
break;
case MS_NUM_EVENTS: case MS_NUM_EVENTS:
{ return (int32)(ring_buffer_readable(device->rbuf)
int32 count; / sizeof(mouse_movement));
get_sem_count(device->sem_cb, &count);
return count;
break;
}
case MS_SET_CLICKSPEED: case MS_SET_CLICKSPEED:
#ifdef __HAIKU__ #ifdef __HAIKU__
return user_memcpy(&device->click_speed, arg, sizeof(bigtime_t)); return user_memcpy(&device->click_speed, arg, sizeof(bigtime_t));
@@ -1011,6 +1008,7 @@ hid_device_control(driver_cookie *cookie, uint32 op,
/* not implemented */ /* not implemented */
break; break;
} }
}
return err; return err;
} }