From a4b6335e57ceea1caf7c8da33579ae45901d22d8 Mon Sep 17 00:00:00 2001 From: Carl Philipp Klemm Date: Tue, 7 May 2024 11:48:55 +0200 Subject: [PATCH] usb_shm: correct refcounting --- eismultiplexer.c | 6 +----- usbshm.c | 45 +++++++++++++++++++++++++++++---------------- usbshm.h | 6 ++---- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/eismultiplexer.c b/eismultiplexer.c index 5248c97..fc542f5 100644 --- a/eismultiplexer.c +++ b/eismultiplexer.c @@ -40,10 +40,6 @@ int eismultiplexer_connect(struct eismultiplexer* muliplexer, uint16_t serial) muliplexer->priv = malloc(sizeof(*muliplexer->priv)); if(!muliplexer->priv) return -1; - - ret = usbshm_init(muliplexer->priv); - if(ret) - return -2; unsigned char serialStr[5]; snprintf((char*)serialStr, sizeof(serialStr), "%04hu", serial); @@ -112,7 +108,7 @@ uint16_t eismultiplexer_read_eeprom(struct eismultiplexer* muliplexer, uint16_t void eismultiplexer_disconnect(struct eismultiplexer* muliplexer) { - usbshm_distroy(muliplexer->priv); + usbshm_close(muliplexer->priv); free(muliplexer->priv); muliplexer->priv = NULL; } diff --git a/usbshm.c b/usbshm.c index d953225..52ddc4f 100644 --- a/usbshm.c +++ b/usbshm.c @@ -44,20 +44,7 @@ static int object_counter = 0; static struct libusb_context* context = NULL; -void usbshm_distroy(struct usbshm* instance) -{ - pthread_mutex_lock(instance->mutex); - libusb_close(instance->handle); - if(instance->serial) - free(instance->serial); -} - -bool usbshm_is_open(struct usbshm* instance) -{ - return instance->handle != NULL; -} - -int usbshm_init(struct usbshm* instance) +static int usbshm_init(struct usbshm* instance) { int ret = 0; if(object_counter == 0) @@ -76,12 +63,38 @@ int usbshm_init(struct usbshm* instance) return ret < 0 ? USBSHM_ERROR_ERR : 0; } +static void usbshm_exit(void) +{ + if(--object_counter == 0) + { + libusb_exit(context); + context = NULL; + } +} + +void usbshm_close(struct usbshm* instance) +{ + pthread_mutex_lock(instance->mutex); + libusb_close(instance->handle); + if(instance->serial) + free(instance->serial); + usbshm_exit(); +} + +bool usbshm_is_open(struct usbshm* instance) +{ + return instance->handle != NULL; +} + int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsigned char* serial) { if(instance->handle) return USBSHM_ERROR_ALLREADY_CONNECTED; - if(!context) - return USBSHM_ERROR_NOT_CONNECTED; + + int ret = usbshm_init(instance); + if(ret < 0) + return ret; + pthread_mutex_lock(instance->mutex); libusb_device** list; int count = libusb_get_device_list(context, &list); diff --git a/usbshm.h b/usbshm.h index 1b0bca2..1e72b69 100644 --- a/usbshm.h +++ b/usbshm.h @@ -48,12 +48,10 @@ struct usbshm { pthread_mutex_t* mutex; }; -void usbshm_distroy(struct usbshm* instance); - -int usbshm_init(struct usbshm* instance); - int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsigned char* serial); +void usbshm_close(struct usbshm* instance); + bool usbshm_is_open(struct usbshm* instance); void usbshm_reset(struct usbshm* instance);