Annotation of qemu/hw/9pfs/virtio-9p-coth.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Virtio 9p backend
        !             3:  *
        !             4:  * Copyright IBM, Corp. 2010
        !             5:  *
        !             6:  * Authors:
        !             7:  *  Harsh Prateek Bora <[email protected]>
        !             8:  *  Venkateswararao Jujjuri(JV) <[email protected]>
        !             9:  *
        !            10:  * This work is licensed under the terms of the GNU GPL, version 2.  See
        !            11:  * the COPYING file in the top-level directory.
        !            12:  *
        !            13:  */
        !            14: 
        !            15: #include "qemu-char.h"
        !            16: #include "fsdev/qemu-fsdev.h"
        !            17: #include "qemu-thread.h"
        !            18: #include "qemu-coroutine.h"
        !            19: #include "virtio-9p-coth.h"
        !            20: 
        !            21: /* v9fs glib thread pool */
        !            22: static V9fsThPool v9fs_pool;
        !            23: 
        !            24: void co_run_in_worker_bh(void *opaque)
        !            25: {
        !            26:     Coroutine *co = opaque;
        !            27:     g_thread_pool_push(v9fs_pool.pool, co, NULL);
        !            28: }
        !            29: 
        !            30: static void v9fs_qemu_process_req_done(void *arg)
        !            31: {
        !            32:     char byte;
        !            33:     ssize_t len;
        !            34:     Coroutine *co;
        !            35: 
        !            36:     do {
        !            37:         len = read(v9fs_pool.rfd, &byte, sizeof(byte));
        !            38:     } while (len == -1 &&  errno == EINTR);
        !            39: 
        !            40:     while ((co = g_async_queue_try_pop(v9fs_pool.completed)) != NULL) {
        !            41:         qemu_coroutine_enter(co, NULL);
        !            42:     }
        !            43: }
        !            44: 
        !            45: static void v9fs_thread_routine(gpointer data, gpointer user_data)
        !            46: {
        !            47:     ssize_t len;
        !            48:     char byte = 0;
        !            49:     Coroutine *co = data;
        !            50: 
        !            51:     qemu_coroutine_enter(co, NULL);
        !            52: 
        !            53:     g_async_queue_push(v9fs_pool.completed, co);
        !            54:     do {
        !            55:         len = write(v9fs_pool.wfd, &byte, sizeof(byte));
        !            56:     } while (len == -1 && errno == EINTR);
        !            57: }
        !            58: 
        !            59: int v9fs_init_worker_threads(void)
        !            60: {
        !            61:     int ret = 0;
        !            62:     int notifier_fds[2];
        !            63:     V9fsThPool *p = &v9fs_pool;
        !            64:     sigset_t set, oldset;
        !            65: 
        !            66:     sigfillset(&set);
        !            67:     /* Leave signal handling to the iothread.  */
        !            68:     pthread_sigmask(SIG_SETMASK, &set, &oldset);
        !            69: 
        !            70:     if (qemu_pipe(notifier_fds) == -1) {
        !            71:         ret = -1;
        !            72:         goto err_out;
        !            73:     }
        !            74:     p->pool = g_thread_pool_new(v9fs_thread_routine, p, -1, FALSE, NULL);
        !            75:     if (!p->pool) {
        !            76:         ret = -1;
        !            77:         goto err_out;
        !            78:     }
        !            79:     p->completed = g_async_queue_new();
        !            80:     if (!p->completed) {
        !            81:         /*
        !            82:          * We are going to terminate.
        !            83:          * So don't worry about cleanup
        !            84:          */
        !            85:         ret = -1;
        !            86:         goto err_out;
        !            87:     }
        !            88:     p->rfd = notifier_fds[0];
        !            89:     p->wfd = notifier_fds[1];
        !            90: 
        !            91:     fcntl(p->rfd, F_SETFL, O_NONBLOCK);
        !            92:     fcntl(p->wfd, F_SETFL, O_NONBLOCK);
        !            93: 
        !            94:     qemu_set_fd_handler(p->rfd, v9fs_qemu_process_req_done, NULL, NULL);
        !            95: err_out:
        !            96:     pthread_sigmask(SIG_SETMASK, &oldset, NULL);
        !            97:     return ret;
        !            98: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.