From f767f32a32baf50da43d51825945f6efbb1070e0 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Tue, 28 Nov 2017 15:16:51 +1100 Subject: [PATCH] [client] syncronization improvements --- client/main.c | 73 ++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/client/main.c b/client/main.c index 616b97a4..78418385 100644 --- a/client/main.c +++ b/client/main.c @@ -121,48 +121,18 @@ int renderThread(void * unused) { // copy the header for our use memcpy(&newHeader, state.shm, sizeof(struct KVMGFXHeader)); + ivshmem_kick_irq(newHeader.guestID, 0); // ensure the header magic is valid, this will help prevent crash out when the memory hasn't yet been initialized - if (memcmp(newHeader.magic, KVMGFX_HEADER_MAGIC, sizeof(KVMGFX_HEADER_MAGIC)) != 0) - continue; - - if (newHeader.version != KVMGFX_HEADER_VERSION) - continue; - - bool ready = false; - bool error = false; - while(state.running && !ready && !error) + if ( + memcmp(newHeader.magic, KVMGFX_HEADER_MAGIC, sizeof(KVMGFX_HEADER_MAGIC)) != 0 || + newHeader.version != KVMGFX_HEADER_VERSION + ) { - // kick the guest and wait for a frame - switch(ivshmem_wait_irq(0)) - { - case IVSHMEM_WAIT_RESULT_OK: - ready = true; - break; - - case IVSHMEM_WAIT_RESULT_TIMEOUT: - ivshmem_kick_irq(newHeader.guestID, 0); - ready = false; - break; - - case IVSHMEM_WAIT_RESULT_ERROR: - error = true; - break; - } + usleep(1000); + continue; } - if (error) - { - DEBUG_ERROR("error during wait for host"); - break; - } - - // we can tell the guest to advance early, it won't - // touch the frame @ dataPos as it double buffers - // so we can safely read from it while the guest now - // writes the next frame - ivshmem_kick_irq(newHeader.guestID, 0); - // if the header is invalid or it has changed if (!areFormatsSame(header, newHeader)) { @@ -372,8 +342,35 @@ int renderThread(void * unused) } SDL_RenderPresent(state.renderer); - state.started = true; + + bool ready = false; + bool error = false; + while(state.running && !ready && !error) + { + // kick the guest and wait for a frame + switch(ivshmem_wait_irq(0)) + { + case IVSHMEM_WAIT_RESULT_OK: + ready = true; + break; + + case IVSHMEM_WAIT_RESULT_TIMEOUT: + ivshmem_kick_irq(newHeader.guestID, 0); + ready = false; + break; + + case IVSHMEM_WAIT_RESULT_ERROR: + error = true; + break; + } + } + + if (error) + { + DEBUG_ERROR("error during wait for host"); + break; + } } state.running = false;