static int ram_save_compressed_page(QEMUFile *f, PageSearchStatus *pss,

                                    bool last_stage,

                                    uint64_t *bytes_transferred)

{

    int pages = -1;

    uint64_t bytes_xmit;

    uint8_t *p;

    int ret;

    RAMBlock *block = pss->block;

    ram_addr_t offset = pss->offset;



    p = block->host + offset;



    bytes_xmit = 0;

    ret = ram_control_save_page(f, block->offset,

                                offset, TARGET_PAGE_SIZE, &bytes_xmit);

    if (bytes_xmit) {

        *bytes_transferred += bytes_xmit;

        pages = 1;

    }

    if (block == last_sent_block) {

        offset |= RAM_SAVE_FLAG_CONTINUE;

    }

    if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {

        if (ret != RAM_SAVE_CONTROL_DELAYED) {

            if (bytes_xmit > 0) {

                acct_info.norm_pages++;

            } else if (bytes_xmit == 0) {

                acct_info.dup_pages++;

            }

        }

    } else {

        /* When starting the process of a new block, the first page of

         * the block should be sent out before other pages in the same

         * block, and all the pages in last block should have been sent

         * out, keeping this order is important, because the 'cont' flag

         * is used to avoid resending the block name.

         */

        if (block != last_sent_block) {

            flush_compressed_data(f);

            pages = save_zero_page(f, block, offset, p, bytes_transferred);

            if (pages == -1) {

                set_compress_params(&comp_param[0], block, offset);

                /* Use the qemu thread to compress the data to make sure the

                 * first page is sent out before other pages

                 */

                bytes_xmit = do_compress_ram_page(&comp_param[0]);

                acct_info.norm_pages++;

                qemu_put_qemu_file(f, comp_param[0].file);

                *bytes_transferred += bytes_xmit;

                pages = 1;

            }

        } else {

            pages = save_zero_page(f, block, offset, p, bytes_transferred);

            if (pages == -1) {

                pages = compress_page_with_multi_thread(f, block, offset,

                                                        bytes_transferred);

            }

        }

    }



    return pages;

}

static int ram_save_compressed_page(QEMUFile *f, PageSearchStatus *pss,

                                    bool last_stage,

                                    uint64_t *bytes_transferred)

{

    int pages = -1;

    uint64_t bytes_xmit;

    uint8_t *p;

    int ret;

    RAMBlock *block = pss->block;

    ram_addr_t offset = pss->offset;



    p = block->host + offset;



    bytes_xmit = 0;

    ret = ram_control_save_page(f, block->offset,

                                offset, TARGET_PAGE_SIZE, &bytes_xmit);

    if (bytes_xmit) {

        *bytes_transferred += bytes_xmit;

        pages = 1;

    }

    if (block == last_sent_block) {

        offset |= RAM_SAVE_FLAG_CONTINUE;

    }

    if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {

        if (ret != RAM_SAVE_CONTROL_DELAYED) {

            if (bytes_xmit > 0) {

                acct_info.norm_pages++;

            } else if (bytes_xmit == 0) {

                acct_info.dup_pages++;

            }

        }

    } else {

        











        if (block != last_sent_block) {

            flush_compressed_data(f);

            pages = save_zero_page(f, block, offset, p, bytes_transferred);

            if (pages == -1) {

                set_compress_params(&comp_param[0], block, offset);

                





                bytes_xmit = do_compress_ram_page(&comp_param[0]);

                acct_info.norm_pages++;

                qemu_put_qemu_file(f, comp_param[0].file);

                *bytes_transferred += bytes_xmit;

                pages = 1;

            }

        } else {

            pages = save_zero_page(f, block, offset, p, bytes_transferred);

            if (pages == -1) {

                pages = compress_page_with_multi_thread(f, block, offset,

                                                        bytes_transferred);

            }

        }

    }



    return pages;

}

static int FUNC_0(QEMUFile *VAR_0, PageSearchStatus *VAR_1,

                                    bool VAR_2,

                                    uint64_t *VAR_3)

{

    int VAR_4 = -1;

    uint64_t bytes_xmit;

    uint8_t *p;

    int VAR_5;

    RAMBlock *block = VAR_1->block;

    ram_addr_t offset = VAR_1->offset;



    p = block->host + offset;



    bytes_xmit = 0;

    VAR_5 = ram_control_save_page(VAR_0, block->offset,

                                offset, TARGET_PAGE_SIZE, &bytes_xmit);

    if (bytes_xmit) {

        *VAR_3 += bytes_xmit;

        VAR_4 = 1;

    }

    if (block == last_sent_block) {

        offset |= RAM_SAVE_FLAG_CONTINUE;

    }

    if (VAR_5 != RAM_SAVE_CONTROL_NOT_SUPP) {

        if (VAR_5 != RAM_SAVE_CONTROL_DELAYED) {

            if (bytes_xmit > 0) {

                acct_info.norm_pages++;

            } else if (bytes_xmit == 0) {

                acct_info.dup_pages++;

            }

        }

    } else {

        











        if (block != last_sent_block) {

            flush_compressed_data(VAR_0);

            VAR_4 = save_zero_page(VAR_0, block, offset, p, VAR_3);

            if (VAR_4 == -1) {

                set_compress_params(&comp_param[0], block, offset);

                





                bytes_xmit = do_compress_ram_page(&comp_param[0]);

                acct_info.norm_pages++;

                qemu_put_qemu_file(VAR_0, comp_param[0].file);

                *VAR_3 += bytes_xmit;

                VAR_4 = 1;

            }

        } else {

            VAR_4 = save_zero_page(VAR_0, block, offset, p, VAR_3);

            if (VAR_4 == -1) {

                VAR_4 = compress_page_with_multi_thread(VAR_0, block, offset,

                                                        VAR_3);

            }

        }

    }



    return VAR_4;

}

static int FUNC_0(QEMUFile *VAR_0, PageSearchStatus *VAR_1,
bool VAR_2,
uint64_t *VAR_3)
{ int VAR_4 = -1; uint64_t bytes_xmit; uint8_t *p; int VAR_5; RAMBlock *block = VAR_1->block; ram_addr_t offset = VAR_1->offset; p = block->host + offset; bytes_xmit = 0; VAR_5 = ram_control_save_page(VAR_0, block->offset,
offset, TARGET_PAGE_SIZE, &bytes_xmit); if (bytes_xmit) { *VAR_3 += bytes_xmit; VAR_4 = 1; } if (block == last_sent_block) { offset |= RAM_SAVE_FLAG_CONTINUE; } if (VAR_5 != RAM_SAVE_CONTROL_NOT_SUPP) { if (VAR_5 != RAM_SAVE_CONTROL_DELAYED) { if (bytes_xmit > 0) { acct_info.norm_pages++; } else if (bytes_xmit == 0) { acct_info.dup_pages++; } } } else { if (block != last_sent_block) { flush_compressed_data(VAR_0); VAR_4 = save_zero_page(VAR_0, block, offset, p, VAR_3); if (VAR_4 == -1) { set_compress_params(&comp_param[0], block, offset); bytes_xmit = do_compress_ram_page(&comp_param[0]); acct_info.norm_pages++; qemu_put_qemu_file(VAR_0, comp_param[0].file); *VAR_3 += bytes_xmit; VAR_4 = 1; } } else { VAR_4 = save_zero_page(VAR_0, block, offset, p, VAR_3); if (VAR_4 == -1) { VAR_4 = compress_page_with_multi_thread(VAR_0, block, offset,
VAR_3); } } } return VAR_4; }