static void throttlePipe_timerFunc( void* opaque ) { ThrottlePipe* pipe = opaque; int64_t now = qemu_get_clock_ns(vm_clock); DD("%s: TICK! now=%lld sendExpiration=%lld recvExpiration=%lld\n", __FUNCTION__, now, pipe->sendExpiration, pipe->recvExpiration); int flags = 0; if (pipe->sendExpiration && now > pipe->sendExpiration) { flags |= PIPE_WAKE_WRITE; pipe->sendExpiration = 0; } if (pipe->recvExpiration && now > pipe->recvExpiration) { flags |= PIPE_WAKE_READ; pipe->recvExpiration = 0; } flags &= pipe->pingpong.flags; if (flags != 0) { DD("%s: WAKE %d\n", __FUNCTION__, flags); goldfish_pipe_wake(pipe->pingpong.hwpipe, flags); } throttlePipe_rearm(pipe); }
static void throttlePipe_timerFunc( void* opaque ) { ThrottlePipe* pipe = opaque; int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); DD("%s: TICK! now=%lld sendExpiration=%lld recvExpiration=%lld\n", __FUNCTION__, now, pipe->sendExpiration, pipe->recvExpiration); /* Timer has expired, signal wake up if needed */ int flags = 0; if (pipe->sendExpiration && now > pipe->sendExpiration) { flags |= PIPE_WAKE_WRITE; pipe->sendExpiration = 0; } if (pipe->recvExpiration && now > pipe->recvExpiration) { flags |= PIPE_WAKE_READ; pipe->recvExpiration = 0; } flags &= pipe->pingpong.flags; if (flags != 0) { DD("%s: WAKE %d\n", __FUNCTION__, flags); goldfish_pipe_wake(pipe->pingpong.hwpipe, flags); } throttlePipe_rearm(pipe); }
static int throttlePipe_recvBuffers( void* opaque, GoldfishPipeBuffer* buffers, int numBuffers ) { ThrottlePipe* pipe = opaque; int ret; if (pipe->recvExpiration > 0) { return PIPE_ERROR_AGAIN; } ret = pingPongPipe_recvBuffers(&pipe->pingpong, buffers, numBuffers); if (ret > 0) { pipe->recvExpiration = qemu_get_clock_ns(vm_clock) + ret*pipe->recvRate; throttlePipe_rearm(pipe); } return ret; }
static int throttlePipe_sendBuffers( void* opaque, const GoldfishPipeBuffer* buffers, int numBuffers ) { ThrottlePipe* pipe = opaque; int ret; if (pipe->sendExpiration > 0) { return PIPE_ERROR_AGAIN; } ret = pingPongPipe_sendBuffers(&pipe->pingpong, buffers, numBuffers); if (ret > 0) { /* Compute next send expiration time */ pipe->sendExpiration = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ret*pipe->sendRate; throttlePipe_rearm(pipe); } return ret; }