Browse Source

Updated with upstream suggestions in https://github.com/libusb/hidapi/pull/582

Sam Lantinga 2 years ago
parent
commit
f082c68b2f

+ 2 - 7
src/hidapi/libusb/hid.c

@@ -1672,14 +1672,9 @@ int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t
 	else if (milliseconds > 0) {
 	else if (milliseconds > 0) {
 		/* Non-blocking, but called with timeout. */
 		/* Non-blocking, but called with timeout. */
 		int res;
 		int res;
-		struct timespec ts;
+		hidapi_timespec ts;
 		hidapi_thread_gettime(&ts);
 		hidapi_thread_gettime(&ts);
-		ts.tv_sec += milliseconds / 1000;
-		ts.tv_nsec += (milliseconds % 1000) * 1000000;
-		if (ts.tv_nsec >= 1000000000L) {
-			ts.tv_sec++;
-			ts.tv_nsec -= 1000000000L;
-		}
+		hidapi_thread_addtime(&ts, milliseconds);
 
 
 		while (!dev->input_reports && !dev->shutdown_thread) {
 		while (!dev->input_reports && !dev->shutdown_thread) {
 			res = hidapi_thread_cond_timedwait(&dev->thread_state, &ts);
 			res = hidapi_thread_cond_timedwait(&dev->thread_state, &ts);

+ 18 - 7
src/hidapi/libusb/hidapi_thread_pthread.h

@@ -7,7 +7,9 @@
 
 
  libusb/hidapi Team
  libusb/hidapi Team
 
 
- Copyright 2022, All Rights Reserved.
+ Sam Lantinga
+
+ Copyright 2023, All Rights Reserved.
 
 
  At the discretion of the user of this library,
  At the discretion of the user of this library,
  this software may be licensed under the terms of the
  this software may be licensed under the terms of the
@@ -66,15 +68,13 @@ static int pthread_barrier_wait(pthread_barrier_t *barrier)
 {
 {
 	pthread_mutex_lock(&barrier->mutex);
 	pthread_mutex_lock(&barrier->mutex);
 	++(barrier->count);
 	++(barrier->count);
-	if(barrier->count >= barrier->trip_count)
-	{
+	if(barrier->count >= barrier->trip_count) {
 		barrier->count = 0;
 		barrier->count = 0;
 		pthread_cond_broadcast(&barrier->cond);
 		pthread_cond_broadcast(&barrier->cond);
 		pthread_mutex_unlock(&barrier->mutex);
 		pthread_mutex_unlock(&barrier->mutex);
 		return 1;
 		return 1;
 	}
 	}
-	else
-	{
+	else {
 		pthread_cond_wait(&barrier->cond, &(barrier->mutex));
 		pthread_cond_wait(&barrier->cond, &(barrier->mutex));
 		pthread_mutex_unlock(&barrier->mutex);
 		pthread_mutex_unlock(&barrier->mutex);
 		return 0;
 		return 0;
@@ -85,6 +85,8 @@ static int pthread_barrier_wait(pthread_barrier_t *barrier)
 
 
 #define HIDAPI_THREAD_TIMED_OUT	ETIMEDOUT
 #define HIDAPI_THREAD_TIMED_OUT	ETIMEDOUT
 
 
+typedef struct timespec hidapi_timespec;
+
 typedef struct
 typedef struct
 {
 {
 	pthread_t thread;
 	pthread_t thread;
@@ -126,7 +128,7 @@ static void hidapi_thread_cond_wait(hidapi_thread_state *state)
 	pthread_cond_wait(&state->condition, &state->mutex);
 	pthread_cond_wait(&state->condition, &state->mutex);
 }
 }
 
 
-static int hidapi_thread_cond_timedwait(hidapi_thread_state *state, struct timespec *ts)
+static int hidapi_thread_cond_timedwait(hidapi_thread_state *state, hidapi_timespec *ts)
 {
 {
 	return pthread_cond_timedwait(&state->condition, &state->mutex, ts);
 	return pthread_cond_timedwait(&state->condition, &state->mutex, ts);
 }
 }
@@ -156,8 +158,17 @@ static void hidapi_thread_join(hidapi_thread_state *state)
 	pthread_join(state->thread, NULL);
 	pthread_join(state->thread, NULL);
 }
 }
 
 
-static void hidapi_thread_gettime(struct timespec *ts)
+static void hidapi_thread_gettime(hidapi_timespec *ts)
 {
 {
 	clock_gettime(CLOCK_REALTIME, ts);
 	clock_gettime(CLOCK_REALTIME, ts);
 }
 }
 
 
+static void hidapi_thread_addtime(hidapi_timespec *ts, int milliseconds)
+{
+    ts->tv_sec += milliseconds / 1000;
+    ts->tv_nsec += (milliseconds % 1000) * 1000000;
+    if (ts->tv_nsec >= 1000000000L) {
+        ts->tv_sec++;
+        ts->tv_nsec -= 1000000000L;
+    }
+}

+ 10 - 10
src/hidapi/libusb/hidapi_thread_sdl.h

@@ -76,6 +76,8 @@ static int SDL_WaitThreadBarrier(SDL_ThreadBarrier *barrier)
 
 
 #define HIDAPI_THREAD_TIMED_OUT SDL_MUTEX_TIMEDOUT
 #define HIDAPI_THREAD_TIMED_OUT SDL_MUTEX_TIMEDOUT
 
 
+typedef Uint64 hidapi_timespec;
+
 typedef struct
 typedef struct
 {
 {
     SDL_Thread *thread;
     SDL_Thread *thread;
@@ -123,16 +125,12 @@ static void hidapi_thread_cond_wait(hidapi_thread_state *state)
     SDL_WaitCondition(state->condition, state->mutex);
     SDL_WaitCondition(state->condition, state->mutex);
 }
 }
 
 
-static int hidapi_thread_cond_timedwait(hidapi_thread_state *state, struct timespec *ts)
+static int hidapi_thread_cond_timedwait(hidapi_thread_state *state, hidapi_timespec *ts)
 {
 {
-    Uint64 end_time;
     Sint64 timeout_ns;
     Sint64 timeout_ns;
     Sint32 timeout_ms;
     Sint32 timeout_ms;
 
 
-    end_time = ts->tv_sec;
-    end_time *= 1000000000L;
-    end_time += ts->tv_nsec;
-    timeout_ns = (Sint64)(end_time - SDL_GetTicksNS());
+    timeout_ns = (Sint64)(*ts - SDL_GetTicksNS());
     if (timeout_ns <= 0) {
     if (timeout_ns <= 0) {
         timeout_ms = 0;
         timeout_ms = 0;
     } else {
     } else {
@@ -189,10 +187,12 @@ static void hidapi_thread_join(hidapi_thread_state *state)
     SDL_WaitThread(state->thread, NULL);
     SDL_WaitThread(state->thread, NULL);
 }
 }
 
 
-static void hidapi_thread_gettime(struct timespec *ts)
+static void hidapi_thread_gettime(hidapi_timespec *ts)
 {
 {
-    Uint64 ns = SDL_GetTicksNS();
+    *ts = SDL_GetTicksNS();
+}
 
 
-    ts->tv_sec = ns / 1000000000L;
-    ts->tv_nsec = ns % 1000000000L;
+static void hidapi_thread_addtime(hidapi_timespec *ts, int milliseconds)
+{
+    *ts += SDL_MS_TO_NS(milliseconds);
 }
 }