From c32390f7c1868f03197e6fb8f7df53a8b1a23eaf 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..6ba645a --- /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