summaryrefslogtreecommitdiffstats
path: root/src/device.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2013-12-27 01:55:08 +0100
committerGravatar Nikias Bassen2013-12-27 01:55:08 +0100
commit82e5f5764422393eff28aaa8ed35b3ea3db74490 (patch)
tree0f2aafe75e8233e522af5dc58d6e2d498e4bf501 /src/device.c
parenteb9415e18fda0bf394afe8439319a69bbcb196f4 (diff)
downloadusbmuxd-82e5f5764422393eff28aaa8ed35b3ea3db74490.tar.gz
usbmuxd-82e5f5764422393eff28aaa8ed35b3ea3db74490.tar.bz2
preflight: replace idevice_event_* with thread safe implementation
idevice_event_subscribe() calls usbmuxd_subscribe() which will start a thread waiting for device add/remove events. But this implementation is not able to handle more than one "subscription". However the preflight worker will start a thread for _each_ device resulting in a really messed up situation if more than one device is attached at the same time. This fix will use usbmuxd's internal device_remove function calling a preflight callback to make this implementation thread safe.
Diffstat (limited to 'src/device.c')
-rw-r--r--src/device.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/device.c b/src/device.c
index b6cc32a..1e3cc83 100644
--- a/src/device.c
+++ b/src/device.c
@@ -112,6 +112,7 @@ struct mux_device
112 uint16_t next_sport; 112 uint16_t next_sport;
113 unsigned char *pktbuf; 113 unsigned char *pktbuf;
114 uint32_t pktlen; 114 uint32_t pktlen;
115 void *preflight_cb_data;
115}; 116};
116 117
117static struct collection device_list; 118static struct collection device_list;
@@ -648,6 +649,7 @@ int device_add(struct usb_device *usbdev)
648 dev->next_sport = 1; 649 dev->next_sport = 1;
649 dev->pktbuf = malloc(DEV_MRU); 650 dev->pktbuf = malloc(DEV_MRU);
650 dev->pktlen = 0; 651 dev->pktlen = 0;
652 dev->preflight_cb_data = NULL;
651 struct version_header vh; 653 struct version_header vh;
652 vh.major = htonl(1); 654 vh.major = htonl(1);
653 vh.minor = htonl(0); 655 vh.minor = htonl(0);
@@ -674,6 +676,9 @@ void device_remove(struct usb_device *usbdev)
674 client_device_remove(dev->id); 676 client_device_remove(dev->id);
675 collection_free(&dev->connections); 677 collection_free(&dev->connections);
676 } 678 }
679 if (dev->preflight_cb_data) {
680 preflight_device_remove_cb(dev->preflight_cb_data);
681 }
677 collection_remove(&device_list, dev); 682 collection_remove(&device_list, dev);
678 free(dev->pktbuf); 683 free(dev->pktbuf);
679 free(dev); 684 free(dev);
@@ -690,7 +695,17 @@ void device_set_visible(int device_id)
690 dev->visible = 1; 695 dev->visible = 1;
691 break; 696 break;
692 } 697 }
693 } ENDFOREACH 698 } ENDFOREACH
699}
700
701void device_set_preflight_cb_data(int device_id, void* data)
702{
703 FOREACH(struct mux_device *dev, &device_list) {
704 if(dev->id == device_id) {
705 dev->preflight_cb_data = data;
706 break;
707 }
708 } ENDFOREACH
694} 709}
695 710
696int device_get_count(int include_hidden) 711int device_get_count(int include_hidden)