From 4746c892274a88161174d71ef91bff5f50fac45e Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Fri, 17 Jan 2020 14:35:08 +1100 Subject: [PATCH] [all] moved time and locking methods to the common library --- VERSION | 2 +- client/include/utils.h | 76 +---------------------------- client/renderers/EGL/alert.c | 4 +- client/renderers/EGL/cursor.c | 4 +- client/renderers/EGL/desktop.c | 4 +- client/renderers/EGL/egl.c | 1 + client/renderers/OpenGL/opengl.c | 4 +- client/spice/src/spice.c | 4 +- client/src/ll.c | 4 +- client/src/main.c | 7 +-- common/include/common/locking.h | 9 ++++ common/include/common/time.h | 25 +++++++++- common/src/platform/windows/event.c | 6 +-- 13 files changed, 55 insertions(+), 95 deletions(-) diff --git a/VERSION b/VERSION index eb7bd6e7..f4cd1b84 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -B1-97-g406e22a681+1 \ No newline at end of file +B1-98-g278d851c7c+1 \ No newline at end of file diff --git a/client/include/utils.h b/client/include/utils.h index d3cc761d..66d8506b 100644 --- a/client/include/utils.h +++ b/client/include/utils.h @@ -19,81 +19,9 @@ Place, Suite 330, Boston, MA 02111-1307 USA #pragma once -#include -#include +#include #include -static inline uint64_t microtime() -{ - struct timespec time; - clock_gettime(CLOCK_MONOTONIC_RAW, &time); - return ((uint64_t)time.tv_sec * 1000000) + (time.tv_nsec / 1000); -} - -static inline uint64_t nanotime() -{ - struct timespec time; - clock_gettime(CLOCK_MONOTONIC_RAW, &time); - return ((uint64_t)time.tv_sec * 1e9) + time.tv_nsec; -} - -static inline void nsleep(uint64_t ns) -{ - const struct timespec ts = - { - .tv_sec = ns / 1e9, - .tv_nsec = ns - ((ns / 1e9) * 1e9) - }; - nanosleep(&ts, NULL); -} - -#ifdef ATOMIC_LOCKING - #define LG_LOCK_MODE "Atomic" - typedef volatile int LG_Lock; - #define LG_LOCK_INIT(x) (x) = 0 - #define LG_LOCK(x) while(__sync_lock_test_and_set(&(x), 1)) {nsleep(100);} - #define LG_UNLOCK(x) __sync_lock_release(&x) - #define LG_LOCK_FREE(x) -#else - #include - #define LG_LOCK_MODE "Mutex" - typedef SDL_mutex * LG_Lock; - #define LG_LOCK_INIT(x) (x = SDL_CreateMutex()) - #define LG_LOCK(x) SDL_LockMutex(x) - #define LG_UNLOCK(x) SDL_UnlockMutex(x) - #define LG_LOCK_FREE(x) SDL_DestroyMutex(x) -#endif - -static inline uint32_t get_bit(const uint8_t * const base, size_t * const offset) -{ - uint32_t out = ((*(base + (*offset >> 0x3))) >> (0x7 - (*offset & 0x7))) & 0x1; - ++*offset; - return out; -} - -static inline uint32_t get_bits(const uint8_t * const base, size_t * const offset, const uint8_t bits) -{ - uint32_t value = 0; - for (int i = 0; i < bits; ++i) - value |= (get_bit(base, offset) ? 1 : 0) << (bits - i - 1); - return value; -} - -static inline uint32_t decode_u_golomb(const uint8_t * const base, size_t * const offset) -{ - uint32_t i = 0; - while(get_bit(base, offset) == 0) - ++i; - - return ((1 << i) - 1 + get_bits(base, offset, i)); -} - -static inline int32_t decode_s_golomb(const uint8_t * const base, size_t * const offset) -{ - const uint32_t g = decode_u_golomb(base, offset); - return (g & 0x1) ? (g + 1) / 2 : -(g / 2); -} - // reads the specified file into a new buffer // the callee must free the buffer -bool file_get_contents(const char * filename, char ** buffer, size_t * length); \ No newline at end of file +bool file_get_contents(const char * filename, char ** buffer, size_t * length); diff --git a/client/renderers/EGL/alert.c b/client/renderers/EGL/alert.c index c842e120..9b430527 100644 --- a/client/renderers/EGL/alert.c +++ b/client/renderers/EGL/alert.c @@ -19,7 +19,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "alert.h" #include "common/debug.h" -#include "utils.h" +#include "common/locking.h" #include "texture.h" #include "shader.h" @@ -215,4 +215,4 @@ void egl_alert_render(EGL_Alert * alert, const float scaleX, const float scaleY) egl_model_render(alert->model); glDisable(GL_BLEND); -} \ No newline at end of file +} diff --git a/client/renderers/EGL/cursor.c b/client/renderers/EGL/cursor.c index 9c1e1870..b0a42265 100644 --- a/client/renderers/EGL/cursor.c +++ b/client/renderers/EGL/cursor.c @@ -19,7 +19,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "cursor.h" #include "common/debug.h" -#include "utils.h" +#include "common/locking.h" #include "texture.h" #include "shader.h" @@ -286,4 +286,4 @@ void egl_cursor_render(EGL_Cursor * cursor) } } glDisable(GL_BLEND); -} \ No newline at end of file +} diff --git a/client/renderers/EGL/desktop.c b/client/renderers/EGL/desktop.c index b741df65..9c8f5f95 100644 --- a/client/renderers/EGL/desktop.c +++ b/client/renderers/EGL/desktop.c @@ -20,7 +20,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "desktop.h" #include "common/debug.h" #include "common/option.h" -#include "utils.h" +#include "common/locking.h" #include "texture.h" #include "shader.h" @@ -281,4 +281,4 @@ bool egl_desktop_render(EGL_Desktop * desktop, const float x, const float y, con egl_model_render(desktop->model); return true; -} \ No newline at end of file +} diff --git a/client/renderers/EGL/egl.c b/client/renderers/EGL/egl.c index 2bd63f66..2306320d 100644 --- a/client/renderers/EGL/egl.c +++ b/client/renderers/EGL/egl.c @@ -22,6 +22,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "common/debug.h" #include "common/option.h" #include "common/sysinfo.h" +#include "common/time.h" #include "utils.h" #include "dynamic/fonts.h" diff --git a/client/renderers/OpenGL/opengl.c b/client/renderers/OpenGL/opengl.c index 0ca439c4..0ac3e7ff 100644 --- a/client/renderers/OpenGL/opengl.c +++ b/client/renderers/OpenGL/opengl.c @@ -33,7 +33,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "common/debug.h" #include "common/option.h" #include "common/framebuffer.h" -#include "utils.h" +#include "common/locking.h" #include "dynamic/fonts.h" #include "ll.h" @@ -1344,4 +1344,4 @@ static void draw_mouse(struct Inst * this) glTranslatef(this->mousePos.x, this->mousePos.y, 0.0f); glCallList(this->mouseList); glPopMatrix(); -} \ No newline at end of file +} diff --git a/client/spice/src/spice.c b/client/spice/src/spice.c index 998ff336..8854cb0e 100644 --- a/client/spice/src/spice.c +++ b/client/spice/src/spice.c @@ -18,8 +18,8 @@ Place, Suite 330, Boston, MA 02111-1307 USA */ #include "spice/spice.h" -#include "utils.h" #include "common/debug.h" +#include "common/locking.h" #include #include @@ -1665,4 +1665,4 @@ bool spice_clipboard_data(SpiceDataType type, uint8_t * data, size_t size) free(buffer); return true; -} \ No newline at end of file +} diff --git a/client/src/ll.c b/client/src/ll.c index de709d4d..15d109ec 100644 --- a/client/src/ll.c +++ b/client/src/ll.c @@ -19,7 +19,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "ll.h" -#include "utils.h" +#include "common/locking.h" #include #include @@ -157,4 +157,4 @@ bool ll_walk(struct ll * list, void ** data) LG_UNLOCK(list->lock); return true; -} \ No newline at end of file +} diff --git a/client/src/main.c b/client/src/main.c index 74938179..4fd6bea5 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -45,6 +45,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "common/KVMFR.h" #include "common/stringutils.h" #include "common/thread.h" +#include "common/locking.h" #include "common/event.h" #include "common/ivshmem.h" #include "common/time.h" @@ -112,7 +113,7 @@ static void updatePositionInfo() if (force && params.forceAspect) { - state.resizeTimeout = getMicrotime() + RESIZE_TIMEOUT; + state.resizeTimeout = microtime() + RESIZE_TIMEOUT; state.resizeDone = false; } } @@ -219,7 +220,7 @@ static int renderThread(void * unused) clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &time, NULL); - if (!state.resizeDone && state.resizeTimeout < getMicrotime()) + if (!state.resizeDone && state.resizeTimeout < microtime()) { SDL_SetWindowSize( state.window, @@ -1574,4 +1575,4 @@ int main(int argc, char * argv[]) config_free(); return ret; -} \ No newline at end of file +} diff --git a/common/include/common/locking.h b/common/include/common/locking.h index 3a29667b..406ea9fa 100644 --- a/common/include/common/locking.h +++ b/common/include/common/locking.h @@ -18,6 +18,8 @@ Place, Suite 330, Boston, MA 02111-1307 USA */ #pragma once +#include "time.h" + #define INTERLOCKED_AND8 __sync_fetch_and_and #define INTERLOCKED_OR8 __sync_fetch_and_or #define INTERLOCKED_INC(x) __sync_fetch_and_add((x), 1) @@ -35,3 +37,10 @@ Place, Suite 330, Boston, MA 02111-1307 USA while(__sync_lock_test_and_set(&(lock), 1)) while((lock)); \ x\ __sync_lock_release(&(lock)); + +#define LG_LOCK_MODE "Atomic" +typedef volatile int LG_Lock; +#define LG_LOCK_INIT(x) (x) = 0 +#define LG_LOCK(x) while(__sync_lock_test_and_set(&(x), 1)) {nsleep(100);} +#define LG_UNLOCK(x) __sync_lock_release(&x) +#define LG_LOCK_FREE(x) diff --git a/common/include/common/time.h b/common/include/common/time.h index 9c4ef217..d59862a0 100644 --- a/common/include/common/time.h +++ b/common/include/common/time.h @@ -25,9 +25,10 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include #else #include +#include #endif -static inline uint64_t getMicrotime() +static inline uint64_t microtime() { #if defined(_WIN32) static LARGE_INTEGER freq = { 0 }; @@ -42,4 +43,24 @@ static inline uint64_t getMicrotime() clock_gettime(CLOCK_MONOTONIC, &time); return (uint64_t)time.tv_sec * 1000000LL + time.tv_nsec / 1000LL; #endif -} \ No newline at end of file +} + +#if !defined(_WIN32) +//FIXME: make win32 versions +static inline uint64_t nanotime() +{ + struct timespec time; + clock_gettime(CLOCK_MONOTONIC_RAW, &time); + return ((uint64_t)time.tv_sec * 1e9) + time.tv_nsec; +} + +static inline void nsleep(uint64_t ns) +{ + const struct timespec ts = + { + .tv_sec = ns / 1e9, + .tv_nsec = ns - ((ns / 1e9) * 1e9) + }; + nanosleep(&ts, NULL); +} +#endif diff --git a/common/src/platform/windows/event.c b/common/src/platform/windows/event.c index e1158e26..2b078206 100644 --- a/common/src/platform/windows/event.c +++ b/common/src/platform/windows/event.c @@ -116,11 +116,11 @@ bool lgWaitEvent(LGEvent * event, unsigned int timeout) } } - uint64_t now = getMicrotime(); + uint64_t now = microtime(); uint64_t end = now + spinTime * 1000; while(!event->signaled) { - now = getMicrotime(); + now = microtime(); if (now >= end) break; } @@ -218,4 +218,4 @@ bool lgResetEvent(LGEvent * event) { event->signaled = false; return ResetEvent(event->handle); -} \ No newline at end of file +}