From f1ad1c3c2fc759f305b028aa3edecda9a66775e1 Mon Sep 17 00:00:00 2001 From: torque Date: Mon, 1 Jul 2024 19:28:30 -0700 Subject: [PATCH] deps.labjack: support building for windows The only pthread functionality this seems to use is mutexes, which are (fortunately) theoretically trivial to wrap for windows. This compiles, though it is not clear if it actually works correctly. --- deps/labjack/ljacklm/build.zig | 4 +++ deps/labjack/ljacklm/libljacklm/ljacklm.c | 13 ++++++++- .../ljacklm/libljacklm/windows_mutex_shim.h | 28 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 deps/labjack/ljacklm/libljacklm/windows_mutex_shim.h diff --git a/deps/labjack/ljacklm/build.zig b/deps/labjack/ljacklm/build.zig index 78ec2c9..7cb124f 100644 --- a/deps/labjack/ljacklm/build.zig +++ b/deps/labjack/ljacklm/build.zig @@ -17,6 +17,10 @@ pub fn build(b: *std.Build) !void { .link_libc = true, }); + if (target.result.os.tag == .windows) { + libljacklm.defineCMacro("LJACKLM_USE_WINDOWS_MUTEX_SHIM", "1"); + } + libljacklm.addCSourceFile(.{ .file = b.path("libljacklm/ljacklm.c") }); libljacklm.installHeader(b.path("libljacklm/ljacklm.h"), "ljacklm.h"); diff --git a/deps/labjack/ljacklm/libljacklm/ljacklm.c b/deps/labjack/ljacklm/libljacklm/ljacklm.c index 0febd8c..eddb20c 100644 --- a/deps/labjack/ljacklm/libljacklm/ljacklm.c +++ b/deps/labjack/ljacklm/libljacklm/ljacklm.c @@ -23,7 +23,14 @@ #include #include #include -#include + +#if defined(LJACKLM_USE_WINDOWS_MUTEX_SHIM) + #include + #include "windows_mutex_shim.h" +#else + #include +#endif // LJACKLM_USE_WINDOWS_MUTEX_SHIM + #include "labjackusb.h" @@ -286,7 +293,9 @@ long GetU12Information( HANDLE hDevice, long *fcddMaxSize, long *hvcMaxSize); +#if !defined(LJACKLM_USE_WINDOWS_MUTEX_SHIM) unsigned long GetTickCount( void); +#endif __attribute__((constructor)) @@ -7266,6 +7275,7 @@ long GetU12Information( HANDLE hDevice, } +#if !defined(LJACKLM_USE_WINDOWS_MUTEX_SHIM) //====================================================================== //GetTickCount: Implementation of GetTickCount() for Unix. Returns the // current time, expressed as millisconds since the Epoch @@ -7276,3 +7286,4 @@ unsigned long GetTickCount( void) gettimeofday(&tv, NULL); return (tv.tv_sec * 1000) + (tv.tv_usec / 1000); } +#endif diff --git a/deps/labjack/ljacklm/libljacklm/windows_mutex_shim.h b/deps/labjack/ljacklm/libljacklm/windows_mutex_shim.h new file mode 100644 index 0000000..5b9f496 --- /dev/null +++ b/deps/labjack/ljacklm/libljacklm/windows_mutex_shim.h @@ -0,0 +1,28 @@ +#ifndef LJACKLM_WIN_MUTEX +#define LJACKLM_WIN_MUTEX + +typedef CRITICAL_SECTION pthread_mutex_t; + +static inline int pthread_mutex_init(pthread_mutex_t *mutex, void *attr) { + InitializeCriticalSection(mutex); + return 0; +} + +static inline void pthread_mutex_lock(pthread_mutex_t *mutex) { + EnterCriticalSection(mutex); +} + +static inline int pthread_mutex_unlock(pthread_mutex_t *mutex) { + LeaveCriticalSection(mutex); + return 0; +} + +static inline int pthread_mutex_trylock(pthread_mutex_t *mutex) { + return TryEnterCriticalSection(mutex) != 0; +} + +static inline void pthread_mutex_destroy(pthread_mutex_t *mutex) { + DeleteCriticalSection(mutex); +} + +#endif // LJACKLM_WIN_MUTEX