diff options
| author | 2009-02-26 22:25:28 +0100 | |
|---|---|---|
| committer | 2009-02-26 22:25:28 +0100 | |
| commit | f909955d615df615d5c48c2e5829d5e861bcfb2d (patch) | |
| tree | 3f989386efffd52f3d8510038b4109460a3d8a0d | |
| parent | eb92d308e2dfba6656b5279e138feee75f2fddb2 (diff) | |
| download | usbmuxd-f909955d615df615d5c48c2e5829d5e861bcfb2d.tar.gz usbmuxd-f909955d615df615d5c48c2e5829d5e861bcfb2d.tar.bz2 | |
proper multi-device support (untested)
| -rw-r--r-- | main.c | 41 |
1 files changed, 23 insertions, 18 deletions
| @@ -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 | ||
| 54 | struct client_data { | 59 | struct client_data { |
| @@ -69,17 +74,6 @@ static struct device_use_info **device_use_list = NULL; | |||
| 69 | static int device_use_count = 0; | 74 | static int device_use_count = 0; |
| 70 | static pthread_mutex_t usbmux_mutex = PTHREAD_MUTEX_INITIALIZER; | 75 | static 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 | */ | ||
| 76 | static pthread_mutex_t writer_mutex = PTHREAD_MUTEX_INITIALIZER; | ||
| 77 | |||
| 78 | /** | ||
| 79 | * mutex to keep the reader threads from reading partial packages | ||
| 80 | */ | ||
| 81 | static 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 | ||
