summaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2009-04-08 13:15:06 +0200
committerGravatar Nikias Bassen2009-04-08 13:15:06 +0200
commit4402ead1fcc01a75e1632be04e910359f23e9881 (patch)
treed5a87df26303ea42781c1216ec5213ed9391a8b0 /main.c
parent3aa04f1fc526d7f8d33ebafb7ab7c130350b81ed (diff)
downloadusbmuxd-4402ead1fcc01a75e1632be04e910359f23e9881.tar.gz
usbmuxd-4402ead1fcc01a75e1632be04e910359f23e9881.tar.bz2
Start bulk reader thread _after_ successfully creating a connection to
to prevent pthread locking with uninitialized locking variable. Still only started once per device.
Diffstat (limited to 'main.c')
-rw-r--r--main.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/main.c b/main.c
index 8560aac..a75a440 100644
--- a/main.c
+++ b/main.c
@@ -633,11 +633,11 @@ connect:
633 cur_dev->use_count = 1; 633 cur_dev->use_count = 1;
634 cur_dev->device_id = c_req->device_id; 634 cur_dev->device_id = c_req->device_id;
635 cur_dev->phone = phone; 635 cur_dev->phone = phone;
636 cur_dev->bulk_reader = 0;
636 pthread_mutex_init(&cur_dev->mutex, NULL); 637 pthread_mutex_init(&cur_dev->mutex, NULL);
637 pthread_mutex_init(&cur_dev->writer_mutex, NULL); 638 pthread_mutex_init(&cur_dev->writer_mutex, NULL);
638 639
639 if (verbose >= 3) fprintf(stderr, "%s: device_use_count = %d\n", __func__, device_use_count); 640 if (verbose >= 3) fprintf(stderr, "%s: device_use_count = %d\n", __func__, device_use_count);
640 pthread_create(&cur_dev->bulk_reader, NULL, usbmuxd_bulk_reader_thread, cur_dev);
641 641
642 pthread_mutex_lock(&usbmux_mutex); 642 pthread_mutex_lock(&usbmux_mutex);
643 device_use_list = (struct device_use_info**)realloc(device_use_list, sizeof(struct device_use_info*) * (device_use_count+1)); 643 device_use_list = (struct device_use_info**)realloc(device_use_list, sizeof(struct device_use_info*) * (device_use_count+1));
@@ -661,6 +661,11 @@ connect:
661 goto leave; 661 goto leave;
662 } 662 }
663 663
664 // start bulk reader thread (once per device)
665 if (cur_dev->bulk_reader == 0) {
666 pthread_create(&cur_dev->bulk_reader, NULL, usbmuxd_bulk_reader_thread, cur_dev);
667 }
668
664 // start connection handler thread 669 // start connection handler thread
665 cdata->handler_dead = 0; 670 cdata->handler_dead = 0;
666 cdata->tag = c_req->header.tag; 671 cdata->tag = c_req->header.tag;
@@ -728,7 +733,9 @@ leave:
728 if (verbose >= 3) fprintf(stderr, "%s: last client disconnected, cleaning up\n", __func__); 733 if (verbose >= 3) fprintf(stderr, "%s: last client disconnected, cleaning up\n", __func__);
729 cur_dev->use_count = 0; 734 cur_dev->use_count = 0;
730 pthread_mutex_unlock(&cur_dev->mutex); 735 pthread_mutex_unlock(&cur_dev->mutex);
731 pthread_join(cur_dev->bulk_reader, NULL); 736 if (cur_dev->bulk_reader != 0) {
737 pthread_join(cur_dev->bulk_reader, NULL);
738 }
732 pthread_mutex_lock(&usb_mutex); 739 pthread_mutex_lock(&usb_mutex);
733 iphone_free_device(cur_dev->phone); 740 iphone_free_device(cur_dev->phone);
734 pthread_mutex_unlock(&usb_mutex); 741 pthread_mutex_unlock(&usb_mutex);