diff --git a/usbshm.c b/usbshm.c index 78620727cdb3ffaa72e07e54166d5a541ca145d6..94c37bac0c1243baf25269864e7125b1966006ab 100644 --- a/usbshm.c +++ b/usbshm.c @@ -104,7 +104,8 @@ int usbshm_init(struct usbshm* instance, void (*dataCallback)(uint8_t request, u pthread_mutex_init(libusbDataMutex, NULL); pthread_create(&libusbThread, NULL, &usbshm_libusbPoll, NULL); } - if(ret == 0) objectCounter++; + if(ret == 0) + objectCounter++; return ret; } @@ -179,12 +180,17 @@ int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsi bool usbshm_usbshm_isOpen(struct usbshm* instance) { - return instance->priv->handle != NULL; + pthread_mutex_lock(libusbDataMutex); + bool ret = instance->priv->handle != NULL; + pthread_mutex_unlock(libusbDataMutex); + return ret; } void usbshm_reset(struct usbshm* instance) { + pthread_mutex_lock(libusbDataMutex); libusb_reset_device(instance->priv->handle); + pthread_mutex_unlock(libusbDataMutex); } void usbshm_reopen(struct usbshm* instance) @@ -215,7 +221,6 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request, libusb_fill_control_transfer(instance->priv->transfer, instance->priv->handle, instance->priv->buffer, &usbshm_transferCallBack, instance, 100); int ret = libusb_submit_transfer(instance->priv->transfer); - pthread_mutex_unlock(libusbDataMutex); if(ret < 0) { free(buffer); @@ -223,6 +228,7 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request, instance->priv->transfer = NULL; if(ret == LIBUSB_ERROR_NO_DEVICE) usbshm_reopen(instance); + pthread_mutex_unlock(libusbDataMutex); } return ret < 0 ? USBSHM_ERROR_ERR : 0; } @@ -245,7 +251,6 @@ int usbshm_readControlTransfer(struct usbshm* instance, const uint8_t request, c libusb_fill_control_transfer(instance->priv->transfer, instance->priv->handle, instance->priv->buffer, &usbshm_transferCallBack, instance, 100); int ret = libusb_submit_transfer(instance->priv->transfer); - pthread_mutex_unlock(libusbDataMutex); if(ret < 0) { free(instance->priv->buffer); @@ -253,6 +258,7 @@ int usbshm_readControlTransfer(struct usbshm* instance, const uint8_t request, c instance->priv->transfer = NULL; if(ret == LIBUSB_ERROR_NO_DEVICE) usbshm_reopen(instance); + pthread_mutex_unlock(libusbDataMutex); } return ret < 0 ? USBSHM_ERROR_ERR : 0; } @@ -274,10 +280,14 @@ static void usbshm_transferCallBack(struct libusb_transfer *transfer) free(context->priv->buffer); libusb_free_transfer(context->priv->transfer); context->priv->transfer = NULL; + pthread_mutex_unlock(libusbDataMutex); } int usbshm_readControlTransferSync(struct usbshm* instance, const uint8_t request, const uint16_t wValue, const uint16_t wIndex, uint8_t* buffer, const uint16_t length) { - return libusb_control_transfer(instance->priv->handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN, - request, wValue, wIndex, buffer, length, 2000); + pthread_mutex_lock(libusbDataMutex); + int ret = libusb_control_transfer(instance->priv->handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN, + request, wValue, wIndex, buffer, length, 2000); + pthread_mutex_unlock(libusbDataMutex); + return ret; }