All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH 3/7] usb hid: move head+n to common struct
Date: Fri, 14 Jan 2011 17:31:03 +0100	[thread overview]
Message-ID: <4D307A47.5050601@redhat.com> (raw)
In-Reply-To: <1295006132-29153-4-git-send-email-kraxel@redhat.com>

On 01/14/2011 12:55 PM, Gerd Hoffmann wrote:
> This patch moves the 'head' and 'n' fields from USBMouseState and
> USBKeyboardState to the common USBHIDState struct.
>
> Signed-off-by: Gerd Hoffmann<kraxel@redhat.com>
> ---
>   hw/usb-hid.c |   46 ++++++++++++++++++++++------------------------
>   1 files changed, 22 insertions(+), 24 deletions(-)
>
> diff --git a/hw/usb-hid.c b/hw/usb-hid.c
> index 9444051..8148d66 100644
> --- a/hw/usb-hid.c
> +++ b/hw/usb-hid.c
> @@ -56,16 +56,12 @@ typedef struct USBPointerEvent {
>
>   typedef struct USBMouseState {
>       USBPointerEvent queue[QUEUE_LENGTH];
> -    uint32_t head; /* index into circular queue */
> -    uint32_t n;
>       int mouse_grabbed;
>       QEMUPutMouseEntry *eh_entry;
>   } USBMouseState;
>
>   typedef struct USBKeyboardState {
>       uint32_t keycodes[QUEUE_LENGTH];
> -    uint32_t head; /* index into circular queue */
> -    uint32_t n;
>       uint16_t modifiers;
>       uint8_t leds;
>       uint8_t key[16];
> @@ -78,6 +74,8 @@ typedef struct USBHIDState {
>           USBMouseState ptr;
>           USBKeyboardState kbd;
>       };
> +    uint32_t head; /* index into circular queue */
> +    uint32_t n;
>       int kind;
>       int protocol;
>       uint8_t idle;
> @@ -468,7 +466,7 @@ static void usb_pointer_event(void *opaque,
>   {
>       USBHIDState *hs = opaque;
>       USBMouseState *s =&hs->ptr;
> -    unsigned use_slot = (s->head + s->n - 1)&  QUEUE_MASK;
> +    unsigned use_slot = (hs->head + hs->n - 1)&  QUEUE_MASK;
>       unsigned previous_slot = (use_slot - 1)&  QUEUE_MASK;
>
>       /* We combine events where feasible to keep the queue small.  We shouldn't
> @@ -476,15 +474,15 @@ static void usb_pointer_event(void *opaque,
>        * that would change the location of the button state change.  When the
>        * queue is empty, a second event is needed because we don't know if
>        * the first event changed the button state.  */
> -    if (s->n == QUEUE_LENGTH) {
> +    if (hs->n == QUEUE_LENGTH) {
>           /* Queue full.  Discard old button state, combine motion normally.  */
>           s->queue[use_slot].buttons_state = buttons_state;
> -    } else if (s->n<  2 ||
> +    } else if (hs->n<  2 ||
>                  s->queue[use_slot].buttons_state != buttons_state ||
>                  s->queue[previous_slot].buttons_state != s->queue[use_slot].buttons_state) {
>           /* Cannot or should not combine, so add an empty item to the queue.  */
>           QUEUE_INCR(use_slot);
> -        s->n++;
> +        hs->n++;
>           usb_pointer_event_clear(&s->queue[use_slot], buttons_state);
>       }
>       usb_pointer_event_combine(&s->queue[use_slot],
> @@ -499,24 +497,25 @@ static void usb_keyboard_event(void *opaque, int keycode)
>       USBKeyboardState *s =&hs->kbd;
>       int slot;
>
> -    if (s->n == QUEUE_LENGTH) {
> +    if (hs->n == QUEUE_LENGTH) {
>           fprintf(stderr, "usb-kbd: warning: key event queue full\n");
>           return;
>       }
> -    slot = (s->head + s->n)&  QUEUE_MASK; s->n++;
> +    slot = (hs->head + hs->n)&  QUEUE_MASK; hs->n++;
>       s->keycodes[slot] = keycode;
>       usb_hid_changed(hs);
>   }
>
> -static void usb_keyboard_process_keycode(USBKeyboardState *s)
> +static void usb_keyboard_process_keycode(USBHIDState *hs)
>   {
> +    USBKeyboardState *s =&hs->kbd;
>       uint8_t hid_code, key;
>       int i, keycode, slot;
>
> -    if (s->n == 0) {
> +    if (hs->n == 0) {
>           return;
>       }
> -    slot = s->head&  QUEUE_MASK; QUEUE_INCR(s->head); s->n--;
> +    slot = hs->head&  QUEUE_MASK; QUEUE_INCR(hs->head); hs->n--;
>       keycode = s->keycodes[slot];
>
>       key = keycode&  0x7f;
> @@ -587,7 +586,7 @@ static int usb_pointer_poll(USBHIDState *hs, uint8_t *buf, int len)
>
>       /* When the buffer is empty, return the last event.  Relative
>          movements will all be zero.  */
> -    index = (s->n ? s->head : s->head - 1);
> +    index = (hs->n ? hs->head : hs->head - 1);
>       e =&s->queue[index&  QUEUE_MASK];
>
>       if (hs->kind == USB_MOUSE) {
> @@ -610,12 +609,12 @@ static int usb_pointer_poll(USBHIDState *hs, uint8_t *buf, int len)
>       if (e->buttons_state&  MOUSE_EVENT_MBUTTON)
>           b |= 0x04;
>
> -    if (s->n&&
> +    if (hs->n&&
>           !e->dz&&
>           (hs->kind == USB_TABLET || (!e->xdx&&  !e->ydy))) {
>           /* that deals with this event */
> -        QUEUE_INCR(s->head);
> -        s->n--;
> +        QUEUE_INCR(hs->head);
> +        hs->n--;
>       }
>
>       /* Appears we have to invert the wheel direction */
> @@ -661,7 +660,7 @@ static int usb_keyboard_poll(USBHIDState *hs, uint8_t *buf, int len)
>       if (len<  2)
>           return 0;
>
> -    usb_keyboard_process_keycode(s);
> +    usb_keyboard_process_keycode(hs);
>
>       buf[0] = s->modifiers&  0xff;
>       buf[1] = 0;
> @@ -699,8 +698,8 @@ static void usb_mouse_handle_reset(USBDevice *dev)
>       USBHIDState *s = (USBHIDState *)dev;
>
>       memset(s->ptr.queue, 0, sizeof (s->ptr.queue));
> -    s->ptr.head = 0;
> -    s->ptr.n = 0;
> +    s->head = 0;
> +    s->n = 0;
>       s->protocol = 1;
>   }
>
> @@ -710,8 +709,8 @@ static void usb_keyboard_handle_reset(USBDevice *dev)
>
>       qemu_add_kbd_event_handler(usb_keyboard_event, s);
>       memset(s->kbd.keycodes, 0, sizeof (s->kbd.keycodes));
> -    s->kbd.head = 0;
> -    s->kbd.n = 0;
> +    s->head = 0;
> +    s->n = 0;
>       memset(s->kbd.key, 0, sizeof (s->kbd.key));
>       s->kbd.keys = 0;
>       s->protocol = 1;
> @@ -819,12 +818,11 @@ static int usb_hid_handle_data(USBDevice *dev, USBPacket *p)
>               usb_hid_set_next_idle(s, curtime);
>               if (s->kind == USB_MOUSE || s->kind == USB_TABLET) {
>                   ret = usb_pointer_poll(s, p->data, p->len);
> -                s->changed = s->ptr.n>  0;
>               }
>               else if (s->kind == USB_KEYBOARD) {
>                   ret = usb_keyboard_poll(s, p->data, p->len);
> -                s->changed = s->kbd.n>  0;
>               }
> +            s->changed = s->n>  0;
>           } else {
>               goto fail;
>           }

Acked-by: Paolo Bonzini <pbonzini@redhat.com>

Paolo

  reply	other threads:[~2011-01-14 16:32 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-14 11:55 [Qemu-devel] [PATCH 0/7] usb: add migration support Gerd Hoffmann
2011-01-14 11:55 ` [Qemu-devel] [PATCH 1/7] add event queueing to USB HID Gerd Hoffmann
2011-01-14 11:55 ` [Qemu-devel] [PATCH 2/7] usb keyboard: add event event queue Gerd Hoffmann
2011-01-14 16:30   ` [Qemu-devel] " Paolo Bonzini
2011-01-14 11:55 ` [Qemu-devel] [PATCH 3/7] usb hid: move head+n to common struct Gerd Hoffmann
2011-01-14 16:31   ` Paolo Bonzini [this message]
2011-01-14 11:55 ` [Qemu-devel] [PATCH 4/7] vnc: fix numlock+capslock tracking Gerd Hoffmann
2011-01-14 11:55 ` [Qemu-devel] [PATCH 5/7] usb core: add migration support Gerd Hoffmann
2011-01-14 11:55 ` [Qemu-devel] [PATCH 6/7] usb hub: " Gerd Hoffmann
2011-01-14 11:55 ` [Qemu-devel] [PATCH 7/7] usb hid: " Gerd Hoffmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D307A47.5050601@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.