static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,

                                 VirtIODevice *vdev)

{

    VirtIOSerialPortClass *vsc;



    assert(port);

    assert(virtio_queue_ready(vq));



    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);



    while (!port->throttled) {

        unsigned int i;



        /* Pop an elem only if we haven't left off a previous one mid-way */

        if (!port->elem) {

            port->elem = virtqueue_pop(vq, sizeof(VirtQueueElement));

            if (!port->elem) {

                break;


            port->iov_idx = 0;

            port->iov_offset = 0;




        for (i = port->iov_idx; i < port->elem->out_num; i++) {

            size_t buf_size;

            ssize_t ret;



            buf_size = port->elem->out_sg[i].iov_len - port->iov_offset;

            ret = vsc->have_data(port,

                                  port->elem->out_sg[i].iov_base

                                  + port->iov_offset,

                                  buf_size);




            if (port->throttled) {

                port->iov_idx = i;

                if (ret > 0) {

                    port->iov_offset += ret;


                break;


            port->iov_offset = 0;


        if (port->throttled) {

            break;


        virtqueue_push(vq, port->elem, 0);

        g_free(port->elem);

        port->elem = NULL;


    virtio_notify(vdev, vq);

static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,

                                 VirtIODevice *vdev)

{

    VirtIOSerialPortClass *vsc;



    assert(port);

    assert(virtio_queue_ready(vq));



    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);



    while (!port->throttled) {

        unsigned int i;



        

        if (!port->elem) {

            port->elem = virtqueue_pop(vq, sizeof(VirtQueueElement));

            if (!port->elem) {

                break;


            port->iov_idx = 0;

            port->iov_offset = 0;




        for (i = port->iov_idx; i < port->elem->out_num; i++) {

            size_t buf_size;

            ssize_t ret;



            buf_size = port->elem->out_sg[i].iov_len - port->iov_offset;

            ret = vsc->have_data(port,

                                  port->elem->out_sg[i].iov_base

                                  + port->iov_offset,

                                  buf_size);




            if (port->throttled) {

                port->iov_idx = i;

                if (ret > 0) {

                    port->iov_offset += ret;


                break;


            port->iov_offset = 0;


        if (port->throttled) {

            break;


        virtqueue_push(vq, port->elem, 0);

        g_free(port->elem);

        port->elem = NULL;


    virtio_notify(vdev, vq);

static void FUNC_0(VirtIOSerialPort *VAR_0, VirtQueue *VAR_1,

                                 VirtIODevice *VAR_2)

{

    VirtIOSerialPortClass *vsc;



    assert(VAR_0);

    assert(virtio_queue_ready(VAR_1));



    vsc = VIRTIO_SERIAL_PORT_GET_CLASS(VAR_0);



    while (!VAR_0->throttled) {

        unsigned int VAR_3;



        

        if (!VAR_0->elem) {

            VAR_0->elem = virtqueue_pop(VAR_1, sizeof(VirtQueueElement));

            if (!VAR_0->elem) {

                break;


            VAR_0->iov_idx = 0;

            VAR_0->iov_offset = 0;




        for (VAR_3 = VAR_0->iov_idx; VAR_3 < VAR_0->elem->out_num; VAR_3++) {

            size_t buf_size;

            ssize_t ret;



            buf_size = VAR_0->elem->out_sg[VAR_3].iov_len - VAR_0->iov_offset;

            ret = vsc->have_data(VAR_0,

                                  VAR_0->elem->out_sg[VAR_3].iov_base

                                  + VAR_0->iov_offset,

                                  buf_size);




            if (VAR_0->throttled) {

                VAR_0->iov_idx = VAR_3;

                if (ret > 0) {

                    VAR_0->iov_offset += ret;


                break;


            VAR_0->iov_offset = 0;


        if (VAR_0->throttled) {

            break;


        virtqueue_push(VAR_1, VAR_0->elem, 0);

        g_free(VAR_0->elem);

        VAR_0->elem = NULL;


    virtio_notify(VAR_2, VAR_1);

static void FUNC_0(VirtIOSerialPort *VAR_0, VirtQueue *VAR_1,
VirtIODevice *VAR_2)
{ VirtIOSerialPortClass *vsc; assert(VAR_0); assert(virtio_queue_ready(VAR_1)); vsc = VIRTIO_SERIAL_PORT_GET_CLASS(VAR_0); while (!VAR_0->throttled) { unsigned int VAR_3; if (!VAR_0->elem) { VAR_0->elem = virtqueue_pop(VAR_1, sizeof(VirtQueueElement)); if (!VAR_0->elem) { break; VAR_0->iov_idx = 0; VAR_0->iov_offset = 0; for (VAR_3 = VAR_0->iov_idx; VAR_3 < VAR_0->elem->out_num; VAR_3++) { size_t buf_size; ssize_t ret; buf_size = VAR_0->elem->out_sg[VAR_3].iov_len - VAR_0->iov_offset; ret = vsc->have_data(VAR_0,
VAR_0->elem->out_sg[VAR_3].iov_base
+ VAR_0->iov_offset,
buf_size); if (VAR_0->throttled) { VAR_0->iov_idx = VAR_3; if (ret > 0) { VAR_0->iov_offset += ret; break; VAR_0->iov_offset = 0; if (VAR_0->throttled) { break; virtqueue_push(VAR_1, VAR_0->elem, 0); g_free(VAR_0->elem); VAR_0->elem = NULL; virtio_notify(VAR_2, VAR_1);