virtio-hwkey: modified structure of virtio-hwkey
authorsungmin ha <sungmin82.ha@samsung.com>
Thu, 25 Jul 2013 07:33:13 +0000 (16:33 +0900)
committersungmin ha <sungmin82.ha@samsung.com>
Thu, 25 Jul 2013 07:38:35 +0000 (16:38 +0900)
Change-Id: Ib40e7b84c514568b691b99d8ad786ef1b5364215
Signed-off-by: Sungmin Ha <sungmin82.ha@samsung.com>
package/changelog
package/pkginfo.manifest
tizen/src/hw/maru_virtio_hwkey.c

index 05bad66b05d6cef4093ffb4fce2ac51a4064c77d..b2b2078166a57edd588919ed17a5761f0951f992 100644 (file)
@@ -1,3 +1,6 @@
+* 1.5.70
+- modified structure of virtio-hwkey
+== Sungmin Ha <sungmin82.ha@samsung.com> 2013-07-25
 * 1.5.69
 - support multiple linux distro when installing and removing this package.
 == Kitae Kim <kt920.kim@samsung.com> 2013-07-16
index 5ede08dbde9853687fe615a18998c97bbec71346..e9f12aa842707374dbcb07e9dde8d5176507b453 100644 (file)
@@ -1,4 +1,4 @@
-Version: 1.5.69
+Version: 1.5.70
 Maintainer: Yeong-Kyoon Lee<yeongkyoon.lee@samsung.com>
 Source: emulator
 
index 3389e398978a6c09835d3764c303cb3d16d7283e..6ee4a5b7eb1cdd99ca3febd86f08e82f68b52094 100644 (file)
@@ -36,6 +36,8 @@
 MULTI_DEBUG_CHANNEL(qemu, hwkey);
 
 #define DEVICE_NAME "virtio-hwkey"
+#define MAX_BUF_COUNT 64
+static int vqidx = 0;
 
 /*
  * HW key event queue
@@ -68,7 +70,6 @@ typedef struct ElementEntry {
     QTAILQ_ENTRY(ElementEntry) node;
 } ElementEntry;
 
-static ElementEntry _elem_buf[10];
 static QTAILQ_HEAD(, ElementEntry) elem_queue =
     QTAILQ_HEAD_INITIALIZER(elem_queue);
 
@@ -76,10 +77,10 @@ static unsigned int elem_ringbuf_cnt; /* _elem_buf */
 static unsigned int elem_queue_cnt; /* elem_queue */
 
 VirtIOHWKey *vhk;
+VirtQueueElement elem_vhk;
 
 /* lock for between communication thread and IO thread */
 static pthread_mutex_t event_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t elem_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 void maru_hwkey_event(int event_type, int keycode)
 {
@@ -117,7 +118,6 @@ void maru_hwkey_event(int event_type, int keycode)
 static void maru_virtio_hwkey_handle(VirtIODevice *vdev, VirtQueue *vq)
 {
     int virt_sg_index = 0;
-    ElementEntry *elem_entry = NULL;
 
     TRACE("maru_virtio_hwkey_handle\n");
 
@@ -125,41 +125,16 @@ static void maru_virtio_hwkey_handle(VirtIODevice *vdev, VirtQueue *vq)
         TRACE("virtqueue is empty\n");
         return;
     }
-
-    while (true) {
-        elem_entry = &(_elem_buf[elem_ringbuf_cnt % 10]);
-        elem_ringbuf_cnt++;
-
-        virt_sg_index = virtqueue_pop(vhk->vq, &elem_entry->elem);
-        if (virt_sg_index == 0) {
-            elem_ringbuf_cnt--;
-            break;
-        } else if (virt_sg_index < 0) {
-            ERR("virtqueue is broken\n");
-            elem_ringbuf_cnt--;
-            return;
-        }
-
-        pthread_mutex_lock(&elem_mutex);
-
-        elem_entry->el_index = ++elem_queue_cnt;
-        elem_entry->sg_index = (unsigned int)virt_sg_index;
-
-        /* save VirtQueueElement */
-        QTAILQ_INSERT_TAIL(&elem_queue, elem_entry, node);
-        /* call maru_virtio_hwkey_notify */
-        qemu_bh_schedule(vhk->bh);
-
-        pthread_mutex_unlock(&elem_mutex);
-    }
+    /* Get a queue buffer which is written by guest side. */
+    do {
+        virt_sg_index = virtqueue_pop(vq, &elem_vhk);
+        TRACE("virtqueue pop.\n");
+    } while (virt_sg_index < MAX_BUF_COUNT);
 }
 
 void maru_virtio_hwkey_notify(void)
 {
     HwKeyEventEntry *event_entry = NULL;
-    ElementEntry *elem_entry = NULL;
-    VirtQueueElement *element = NULL;
-    void *vbuf = NULL;
 
     TRACE("maru_virtio_hwkey_notify\n");
 
@@ -174,28 +149,22 @@ void maru_virtio_hwkey_notify(void)
             break;
         }
 
-        elem_entry = QTAILQ_FIRST(&elem_queue);
+        /* get hwkey event from host queue */
+        event_entry = QTAILQ_FIRST(&events_queue);
 
-        if ( elem_entry->sg_index > 0) {
-            /* get hwkey event from host queue */
-            event_entry = QTAILQ_FIRST(&events_queue);
-
-            TRACE("hwkey(%d) : keycode=%d, event_type=%d | \
-              event_queue_cnt=%d\n",
-              event_entry->index,
+        printf("keycode=%d, event_type=%d, event_queue_cnt=%d, vqidx=%d\n",
               event_entry->hwkey.keycode, event_entry->hwkey.event_type,
-              event_queue_cnt);
-          
-            element = &elem_entry->elem;
-            vbuf = element->in_sg[elem_entry->sg_index - 1].iov_base;
-
-            /* copy event into virtio buffer */
-            memcpy(vbuf, &(event_entry->hwkey), sizeof(EmulHWKeyEvent));
+              event_queue_cnt, vqidx);
 
-            virtqueue_push(vhk->vq, element, sizeof(EmulHWKeyEvent));
-            virtio_notify(&vhk->vdev, vhk->vq);
+        /* copy event into virtio buffer */
+        memcpy(elem_vhk.in_sg[vqidx++].iov_base, &(event_entry->hwkey), sizeof(EmulHWKeyEvent));
+        if (vqidx == MAX_BUF_COUNT) {
+            vqidx = 0;
         }
 
+        virtqueue_push(vhk->vq, &elem_vhk, sizeof(EmulHWKeyEvent));
+        virtio_notify(&vhk->vdev, vhk->vq);
+
         pthread_mutex_lock(&event_mutex);
 
         /* remove host event */
@@ -231,7 +200,7 @@ static int virtio_hwkey_device_init(VirtIODevice *vdev)
         return -1;
     }
 
-    vhk->vq = virtio_add_queue(vdev, 64, maru_virtio_hwkey_handle);
+    vhk->vq = virtio_add_queue(vdev, MAX_BUF_COUNT, maru_virtio_hwkey_handle);
 
     vhk->qdev = qdev;