summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/main.c b/main.c
index bf062b7..9bcdece 100644
--- a/main.c
+++ b/main.c
@@ -49,6 +49,11 @@ struct device_use_info {
49 uint32_t device_id; 49 uint32_t device_id;
50 iphone_device_t phone; 50 iphone_device_t phone;
51 int use_count; 51 int use_count;
52 /* mutex for mutual exclusion of calling the iphone_mux_send function
53 * TODO: I don't know if we need really need this? */
54 pthread_mutex_t writer_mutex;
55 /* mutex to keep the reader threads from reading partial packages */
56 pthread_mutex_t reader_mutex;
52}; 57};
53 58
54struct client_data { 59struct client_data {
@@ -69,17 +74,6 @@ static struct device_use_info **device_use_list = NULL;
69static int device_use_count = 0; 74static int device_use_count = 0;
70static pthread_mutex_t usbmux_mutex = PTHREAD_MUTEX_INITIALIZER; 75static pthread_mutex_t usbmux_mutex = PTHREAD_MUTEX_INITIALIZER;
71 76
72/**
73 * mutex for mutual exclusion of calling the iphone_mux_send function
74 * TODO: I don't know if we really need this?
75 */
76static pthread_mutex_t writer_mutex = PTHREAD_MUTEX_INITIALIZER;
77
78/**
79 * mutex to keep the reader threads from reading partial packages
80 */
81static pthread_mutex_t reader_mutex = PTHREAD_MUTEX_INITIALIZER;
82
83#ifdef DEBUG 77#ifdef DEBUG
84/** 78/**
85 * for debugging purposes. 79 * for debugging purposes.
@@ -216,9 +210,9 @@ static void *usbmuxd_client_reader_thread(void *arg)
216 } 210 }
217 211
218 rlen = 0; 212 rlen = 0;
219 //pthread_mutex_lock(&usbmux_mutex); 213 //pthread_mutex_lock(&cdata->duinfo->reader_mutex);
220 err = iphone_mux_recv_timeout(cdata->muxclient, rbuffer, rbuffersize, &rlen, DEFAULT_TIMEOUT); 214 err = iphone_mux_recv_timeout(cdata->muxclient, rbuffer, rbuffersize, &rlen, DEFAULT_TIMEOUT);
221 //pthread_mutex_unlock(&usbmux_mutex); 215 //pthread_mutex_unlock(&cdata->duinfo->reader_mutex);
222 if (err != 0) { 216 if (err != 0) {
223 fprintf(stderr, "%s[%d:%d]: encountered USB read error: %d\n", __func__, cdata->duinfo->device_id, cdata->duinfo->use_count, err); 217 fprintf(stderr, "%s[%d:%d]: encountered USB read error: %d\n", __func__, cdata->duinfo->device_id, cdata->duinfo->use_count, err);
224 break; 218 break;
@@ -275,7 +269,9 @@ static int usbmuxd_handleConnectResult(struct client_data *cdata)
275 } 269 }
276 } else { 270 } else {
277 result = 0; 271 result = 0;
272 pthread_mutex_lock(&cdata->duinfo->reader_mutex);
278 err = iphone_mux_recv_timeout(cdata->muxclient, buffer, maxlen, &rlen, DEFAULT_TIMEOUT); 273 err = iphone_mux_recv_timeout(cdata->muxclient, buffer, maxlen, &rlen, DEFAULT_TIMEOUT);
274 pthread_mutex_unlock(&cdata->duinfo->reader_mutex);
279 if (err != 0) { 275 if (err != 0) {
280 fprintf(stderr, "%s: encountered USB read error: %d\n", __func__, err); 276 fprintf(stderr, "%s: encountered USB read error: %d\n", __func__, err);
281 usbmuxd_send_result(cdata->socket, cdata->tag, -err); 277 usbmuxd_send_result(cdata->socket, cdata->tag, -err);
@@ -335,8 +331,10 @@ static void *usbmuxd_client_handler_thread(void *arg)
335 fprintf(stdout, "%s[%d:%d]: started\n", __func__, cdata->duinfo->device_id,cdata->duinfo->use_count); 331 fprintf(stdout, "%s[%d:%d]: started\n", __func__, cdata->duinfo->device_id,cdata->duinfo->use_count);
336 332
337 if (usbmuxd_handleConnectResult(cdata)) { 333 if (usbmuxd_handleConnectResult(cdata)) {
334 fprintf(stderr, "handleConnectResult: Error\n");
338 goto leave; 335 goto leave;
339 } 336 }
337 fprintf(stdout, "handleConnectResult: Success\n");
340 338
341 // starting mux reader thread 339 // starting mux reader thread
342 cdata->reader_quit = 0; 340 cdata->reader_quit = 0;
@@ -368,7 +366,7 @@ static void *usbmuxd_client_handler_thread(void *arg)
368 366
369 cursor = buffer; 367 cursor = buffer;
370 368
371 pthread_mutex_lock(&writer_mutex); 369 pthread_mutex_lock(&cdata->duinfo->writer_mutex);
372 do { 370 do {
373 wlen = 0; 371 wlen = 0;
374 err = iphone_mux_send(cdata->muxclient, cursor, len, &wlen); 372 err = iphone_mux_send(cdata->muxclient, cursor, len, &wlen);
@@ -385,7 +383,7 @@ static void *usbmuxd_client_handler_thread(void *arg)
385 // advance cursor appropiately. 383 // advance cursor appropiately.
386 cursor += wlen; 384 cursor += wlen;
387 } while ((len > 0) && !quit_flag); 385 } while ((len > 0) && !quit_flag);
388 pthread_mutex_unlock(&writer_mutex); 386 pthread_mutex_unlock(&cdata->duinfo->writer_mutex);
389 if (len < 0) { 387 if (len < 0) {
390 break; 388 break;
391 } 389 }
@@ -551,6 +549,8 @@ static void *usbmuxd_client_init_thread(void *arg)
551 cur_dev->use_count = 1; 549 cur_dev->use_count = 1;
552 cur_dev->device_id = c_req.device_id; 550 cur_dev->device_id = c_req.device_id;
553 cur_dev->phone = phone; 551 cur_dev->phone = phone;
552 pthread_mutex_init(&cur_dev->reader_mutex, NULL);
553 pthread_mutex_init(&cur_dev->writer_mutex, NULL);
554 554
555 fprintf(stdout, "%s: device_use_count = %d\n", __func__, device_use_count); 555 fprintf(stdout, "%s: device_use_count = %d\n", __func__, device_use_count);
556 556
@@ -588,12 +588,15 @@ static void *usbmuxd_client_init_thread(void *arg)
588 588
589 sent_result = 0; 589 sent_result = 0;
590 590
591 // TODO: wait for connect result?
592 // if connect failed, don't run this loop:
593
591 // start reading data from the connected device 594 // start reading data from the connected device
592 while (!quit_flag && !cdata->handler_dead) { 595 while (!quit_flag && !cdata->handler_dead) {
593 pthread_mutex_lock(&reader_mutex); 596 pthread_mutex_lock(&cur_dev->reader_mutex);
594 iphone_mux_pullbulk(cur_dev->phone); 597 iphone_mux_pullbulk(cur_dev->phone);
595 err = iphone_mux_get_error(cdata->muxclient); 598 err = iphone_mux_get_error(cdata->muxclient);
596 pthread_mutex_unlock(&reader_mutex); 599 pthread_mutex_unlock(&cur_dev->reader_mutex);
597 if (err != IPHONE_E_SUCCESS) { 600 if (err != IPHONE_E_SUCCESS) {
598 break; 601 break;
599 } 602 }
@@ -626,6 +629,8 @@ leave:
626 } else { 629 } else {
627 iphone_free_device(cur_dev->phone); 630 iphone_free_device(cur_dev->phone);
628 cur_dev->use_count = 0; 631 cur_dev->use_count = 0;
632 pthread_mutex_destroy(&cur_dev->reader_mutex);
633 pthread_mutex_destroy(&cur_dev->writer_mutex);
629 free(cur_dev); 634 free(cur_dev);
630 cur_dev = NULL; 635 cur_dev = NULL;
631 pthread_mutex_lock(&usbmux_mutex); 636 pthread_mutex_lock(&usbmux_mutex);
@@ -787,7 +792,7 @@ static void *usbmuxd_accept_thread(void *arg)
787 for (i = 0; i < children_capacity; i++) { 792 for (i = 0; i < children_capacity; i++) {
788 if (children[i] != NULL) { 793 if (children[i] != NULL) {
789 pthread_join(children[i]->thread, NULL); 794 pthread_join(children[i]->thread, NULL);
790 free(children[i]); 795 free(children[i]);
791 } 796 }
792 } 797 }
793 798