summaryrefslogtreecommitdiffstats
path: root/src/libusbmuxd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libusbmuxd.c')
-rw-r--r--src/libusbmuxd.c45
1 files changed, 13 insertions, 32 deletions
diff --git a/src/libusbmuxd.c b/src/libusbmuxd.c
index 0a0dc88..62af3e2 100644
--- a/src/libusbmuxd.c
+++ b/src/libusbmuxd.c
@@ -104,6 +104,8 @@ static char *prog_name = NULL;
#include "socket.h"
// misc utility functions
#include "collection.h"
+// threads
+#include "thread.h"
static int libusbmuxd_debug = 0;
#ifndef PACKAGE
@@ -114,11 +116,7 @@ static int libusbmuxd_debug = 0;
static struct collection devices;
static usbmuxd_event_cb_t event_cb = NULL;
-#ifdef WIN32
-HANDLE devmon = NULL;
-#else
-pthread_t devmon;
-#endif
+static THREAD_T devmon = THREAD_T_NULL;
static int listenfd = -1;
static volatile int use_tag = 0;
@@ -1036,8 +1034,8 @@ static void *device_monitor(void *data)
{
collection_init(&devices);
-#ifndef WIN32
- pthread_cleanup_push(device_monitor_cleanup, NULL);
+#ifdef HAVE_THREAD_CLEANUP
+ thread_cleanup_push(device_monitor_cleanup, NULL);
#endif
while (event_cb) {
@@ -1054,8 +1052,8 @@ static void *device_monitor(void *data)
}
}
-#ifndef WIN32
- pthread_cleanup_pop(1);
+#ifdef HAVE_THREAD_CLEANUP
+ thread_cleanup_pop(1);
#else
device_monitor_cleanup(NULL);
#endif
@@ -1071,15 +1069,7 @@ USBMUXD_API int usbmuxd_subscribe(usbmuxd_event_cb_t callback, void *user_data)
}
event_cb = callback;
-#ifdef WIN32
- res = 0;
- devmon = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)device_monitor, user_data, 0, NULL);
- if (devmon == NULL) {
- res = GetLastError();
- }
-#else
- res = pthread_create(&devmon, NULL, device_monitor, user_data);
-#endif
+ res = thread_new(&devmon, device_monitor, user_data);
if (res != 0) {
LIBUSBMUXD_DEBUG(1, "%s: ERROR: Could not start device watcher thread!\n", __func__);
return res;
@@ -1089,28 +1079,19 @@ USBMUXD_API int usbmuxd_subscribe(usbmuxd_event_cb_t callback, void *user_data)
USBMUXD_API int usbmuxd_unsubscribe()
{
- int res;
+ int res = 0;
event_cb = NULL;
socket_shutdown(listenfd, SHUT_RDWR);
-#ifdef WIN32
- if (devmon != NULL) {
- res = WaitForSingleObject(devmon, INFINITE);
- if (res != 0) {
- return res;
- }
- }
-#else
- res = pthread_kill(devmon, 0);
- if (res == 0) {
- pthread_cancel(devmon);
- res = pthread_join(devmon, NULL);
+ if (thread_alive(devmon)) {
+ thread_cancel(devmon);
+ res = thread_join(devmon);
+ thread_free(devmon);
}
if ((res != 0) && (res != ESRCH)) {
return res;
}
-#endif
return 0;
}