Changeset a35b458 in mainline for uspace/lib/c/generic/loc.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/loc.c
r3061bc1 ra35b458 60 60 ipc_call_t call; 61 61 ipc_callid_t callid = async_get_call(&call); 62 62 63 63 if (!IPC_GET_IMETHOD(call)) { 64 64 /* TODO: Handle hangup */ 65 65 return; 66 66 } 67 67 68 68 switch (IPC_GET_IMETHOD(call)) { 69 69 case LOC_EVENT_CAT_CHANGE: … … 71 71 loc_cat_change_cb_t cb_fun = cat_change_cb; 72 72 fibril_mutex_unlock(&loc_callback_mutex); 73 73 74 74 async_answer_0(callid, EOK); 75 75 76 76 if (cb_fun != NULL) 77 77 (*cb_fun)(); 78 78 79 79 break; 80 80 default: … … 89 89 { 90 90 fibril_mutex_lock(mtx); 91 91 92 92 if ((*dst == NULL) && (src != NULL)) 93 93 *dst = src; 94 94 95 95 fibril_mutex_unlock(mtx); 96 96 } … … 108 108 async_exch_t *exch = 109 109 loc_exchange_begin_blocking(INTERFACE_LOC_CONSUMER); 110 110 111 111 ipc_call_t answer; 112 112 aid_t req = async_send_0(exch, LOC_CALLBACK_CREATE, &answer); 113 113 114 114 port_id_t port; 115 115 errno_t rc = async_create_callback_port(exch, INTERFACE_LOC_CB, 0, 0, 116 116 loc_cb_conn, NULL, &port); 117 117 118 118 loc_exchange_end(exch); 119 119 120 120 if (rc != EOK) 121 121 return rc; 122 122 123 123 errno_t retval; 124 124 async_wait_for(req, &retval); 125 125 if (retval != EOK) 126 126 return retval; 127 127 128 128 loc_callback_created = true; 129 129 } 130 130 131 131 return EOK; 132 132 } … … 144 144 case INTERFACE_LOC_SUPPLIER: 145 145 fibril_mutex_lock(&loc_supp_block_mutex); 146 146 147 147 while (loc_supp_block_sess == NULL) { 148 148 clone_session(&loc_supplier_mutex, loc_supplier_sess, 149 149 &loc_supp_block_sess); 150 150 151 151 if (loc_supp_block_sess == NULL) 152 152 loc_supp_block_sess = … … 154 154 INTERFACE_LOC_SUPPLIER, 0); 155 155 } 156 156 157 157 fibril_mutex_unlock(&loc_supp_block_mutex); 158 158 159 159 clone_session(&loc_supplier_mutex, loc_supp_block_sess, 160 160 &loc_supplier_sess); 161 161 162 162 return async_exchange_begin(loc_supp_block_sess); 163 163 case INTERFACE_LOC_CONSUMER: 164 164 fibril_mutex_lock(&loc_cons_block_mutex); 165 165 166 166 while (loc_cons_block_sess == NULL) { 167 167 clone_session(&loc_consumer_mutex, loc_consumer_sess, 168 168 &loc_cons_block_sess); 169 169 170 170 if (loc_cons_block_sess == NULL) 171 171 loc_cons_block_sess = … … 173 173 INTERFACE_LOC_CONSUMER, 0); 174 174 } 175 175 176 176 fibril_mutex_unlock(&loc_cons_block_mutex); 177 177 178 178 clone_session(&loc_consumer_mutex, loc_cons_block_sess, 179 179 &loc_consumer_sess); 180 180 181 181 return async_exchange_begin(loc_cons_block_sess); 182 182 default: … … 197 197 case INTERFACE_LOC_SUPPLIER: 198 198 fibril_mutex_lock(&loc_supplier_mutex); 199 199 200 200 if (loc_supplier_sess == NULL) 201 201 loc_supplier_sess = 202 202 service_connect(SERVICE_LOC, 203 203 INTERFACE_LOC_SUPPLIER, 0); 204 204 205 205 fibril_mutex_unlock(&loc_supplier_mutex); 206 206 207 207 if (loc_supplier_sess == NULL) 208 208 return NULL; 209 209 210 210 return async_exchange_begin(loc_supplier_sess); 211 211 case INTERFACE_LOC_CONSUMER: 212 212 fibril_mutex_lock(&loc_consumer_mutex); 213 213 214 214 if (loc_consumer_sess == NULL) 215 215 loc_consumer_sess = 216 216 service_connect(SERVICE_LOC, 217 217 INTERFACE_LOC_CONSUMER, 0); 218 218 219 219 fibril_mutex_unlock(&loc_consumer_mutex); 220 220 221 221 if (loc_consumer_sess == NULL) 222 222 return NULL; 223 223 224 224 return async_exchange_begin(loc_consumer_sess); 225 225 default: … … 242 242 { 243 243 async_exch_t *exch = loc_exchange_begin_blocking(INTERFACE_LOC_SUPPLIER); 244 244 245 245 ipc_call_t answer; 246 246 aid_t req = async_send_2(exch, LOC_SERVER_REGISTER, 0, 0, &answer); 247 247 errno_t retval = async_data_write_start(exch, name, str_size(name)); 248 248 249 249 if (retval != EOK) { 250 250 async_forget(req); … … 252 252 return retval; 253 253 } 254 254 255 255 async_connect_to_me(exch, 0, 0, 0); 256 256 … … 262 262 async_wait_for(req, &retval); 263 263 loc_exchange_end(exch); 264 264 265 265 return retval; 266 266 } … … 275 275 { 276 276 async_exch_t *exch = loc_exchange_begin_blocking(INTERFACE_LOC_SUPPLIER); 277 277 278 278 ipc_call_t answer; 279 279 aid_t req = async_send_0(exch, LOC_SERVICE_REGISTER, &answer); 280 280 errno_t retval = async_data_write_start(exch, fqsn, str_size(fqsn)); 281 281 282 282 if (retval != EOK) { 283 283 async_forget(req); … … 285 285 return retval; 286 286 } 287 287 288 288 /* 289 289 * First wait for the answer and then end the exchange. The opposite … … 293 293 async_wait_for(req, &retval); 294 294 loc_exchange_end(exch); 295 295 296 296 if (retval != EOK) { 297 297 if (sid != NULL) 298 298 *sid = -1; 299 300 return retval; 301 } 302 299 300 return retval; 301 } 302 303 303 if (sid != NULL) 304 304 *sid = (service_id_t) IPC_GET_ARG1(answer); 305 305 306 306 return retval; 307 307 } … … 315 315 async_exch_t *exch; 316 316 errno_t retval; 317 317 318 318 exch = loc_exchange_begin_blocking(INTERFACE_LOC_SUPPLIER); 319 319 retval = async_req_1_0(exch, LOC_SERVICE_UNREGISTER, sid); 320 320 loc_exchange_end(exch); 321 321 322 322 return (errno_t)retval; 323 323 } … … 327 327 { 328 328 async_exch_t *exch; 329 329 330 330 if (flags & IPC_FLAG_BLOCKING) 331 331 exch = loc_exchange_begin_blocking(INTERFACE_LOC_CONSUMER); … … 335 335 return errno; 336 336 } 337 337 338 338 ipc_call_t answer; 339 339 aid_t req = async_send_2(exch, LOC_SERVICE_GET_ID, flags, 0, 340 340 &answer); 341 341 errno_t retval = async_data_write_start(exch, fqdn, str_size(fqdn)); 342 343 loc_exchange_end(exch); 344 342 343 loc_exchange_end(exch); 344 345 345 if (retval != EOK) { 346 346 async_forget(req); 347 347 return retval; 348 348 } 349 349 350 350 async_wait_for(req, &retval); 351 351 352 352 if (retval != EOK) { 353 353 if (handle != NULL) 354 354 *handle = (service_id_t) -1; 355 356 return retval; 357 } 358 355 356 return retval; 357 } 358 359 359 if (handle != NULL) 360 360 *handle = (service_id_t) IPC_GET_ARG1(answer); 361 361 362 362 return retval; 363 363 } … … 380 380 size_t act_size; 381 381 errno_t dretval; 382 382 383 383 *name = NULL; 384 384 exch = loc_exchange_begin_blocking(INTERFACE_LOC_CONSUMER); 385 385 386 386 ipc_call_t answer; 387 387 aid_t req = async_send_1(exch, method, id, &answer); … … 389 389 &dreply); 390 390 async_wait_for(dreq, &dretval); 391 392 loc_exchange_end(exch); 393 391 392 loc_exchange_end(exch); 393 394 394 if (dretval != EOK) { 395 395 async_forget(req); 396 396 return dretval; 397 397 } 398 398 399 399 errno_t retval; 400 400 async_wait_for(req, &retval); 401 401 402 402 if (retval != EOK) 403 403 return retval; 404 404 405 405 act_size = IPC_GET_ARG2(dreply); 406 406 assert(act_size <= LOC_NAME_MAXLEN); … … 410 410 if (*name == NULL) 411 411 return ENOMEM; 412 412 413 413 return EOK; 414 414 } … … 460 460 { 461 461 async_exch_t *exch; 462 462 463 463 if (flags & IPC_FLAG_BLOCKING) 464 464 exch = loc_exchange_begin_blocking(INTERFACE_LOC_CONSUMER); … … 468 468 return errno; 469 469 } 470 470 471 471 ipc_call_t answer; 472 472 aid_t req = async_send_2(exch, LOC_NAMESPACE_GET_ID, flags, 0, 473 473 &answer); 474 474 errno_t retval = async_data_write_start(exch, name, str_size(name)); 475 476 loc_exchange_end(exch); 477 475 476 loc_exchange_end(exch); 477 478 478 if (retval != EOK) { 479 479 async_forget(req); 480 480 return retval; 481 481 } 482 482 483 483 async_wait_for(req, &retval); 484 484 485 485 if (retval != EOK) { 486 486 if (handle != NULL) 487 487 *handle = (service_id_t) -1; 488 489 return retval; 490 } 491 488 489 return retval; 490 } 491 492 492 if (handle != NULL) 493 493 *handle = (service_id_t) IPC_GET_ARG1(answer); 494 494 495 495 return retval; 496 496 } … … 509 509 { 510 510 async_exch_t *exch; 511 511 512 512 if (flags & IPC_FLAG_BLOCKING) 513 513 exch = loc_exchange_begin_blocking(INTERFACE_LOC_CONSUMER); … … 517 517 return errno; 518 518 } 519 519 520 520 ipc_call_t answer; 521 521 aid_t req = async_send_0(exch, LOC_CATEGORY_GET_ID, 522 522 &answer); 523 523 errno_t retval = async_data_write_start(exch, name, str_size(name)); 524 525 loc_exchange_end(exch); 526 524 525 loc_exchange_end(exch); 526 527 527 if (retval != EOK) { 528 528 async_forget(req); 529 529 return retval; 530 530 } 531 531 532 532 async_wait_for(req, &retval); 533 533 534 534 if (retval != EOK) { 535 535 if (cat_id != NULL) 536 536 *cat_id = (category_id_t) -1; 537 538 return retval; 539 } 540 537 538 return retval; 539 } 540 541 541 if (cat_id != NULL) 542 542 *cat_id = (category_id_t) IPC_GET_ARG1(answer); 543 543 544 544 return retval; 545 545 } … … 549 549 { 550 550 async_exch_t *exch = loc_exchange_begin_blocking(INTERFACE_LOC_CONSUMER); 551 551 552 552 sysarg_t type; 553 553 errno_t retval = async_req_1_1(exch, LOC_ID_PROBE, handle, &type); 554 555 loc_exchange_end(exch); 556 554 555 loc_exchange_end(exch); 556 557 557 if (retval != EOK) 558 558 return LOC_OBJECT_NONE; 559 559 560 560 return (loc_object_type_t) type; 561 561 } … … 565 565 { 566 566 async_sess_t *sess; 567 567 568 568 if (flags & IPC_FLAG_BLOCKING) 569 569 sess = service_connect_blocking(SERVICE_LOC, iface, handle); 570 570 else 571 571 sess = service_connect(SERVICE_LOC, iface, handle); 572 572 573 573 return sess; 574 574 } … … 580 580 { 581 581 async_exch_t *exch = loc_exchange_begin_blocking(INTERFACE_LOC_CONSUMER); 582 582 583 583 sysarg_t null_id; 584 584 errno_t retval = async_req_0_1(exch, LOC_NULL_CREATE, &null_id); 585 586 loc_exchange_end(exch); 587 585 586 loc_exchange_end(exch); 587 588 588 if (retval != EOK) 589 589 return -1; 590 590 591 591 return (int) null_id; 592 592 } … … 605 605 if (retval != EOK) 606 606 return 0; 607 607 608 608 return count; 609 609 } … … 619 619 async_exch_t *exch; 620 620 errno_t retval; 621 621 622 622 exch = loc_exchange_begin_blocking(INTERFACE_LOC_SUPPLIER); 623 623 retval = async_req_2_0(exch, LOC_SERVICE_ADD_TO_CAT, svc_id, cat_id); 624 624 loc_exchange_end(exch); 625 625 626 626 return retval; 627 627 } … … 635 635 if (retval != EOK) 636 636 return 0; 637 637 638 638 return count; 639 639 } … … 644 644 size_t size = loc_count_namespaces_internal(exch); 645 645 loc_exchange_end(exch); 646 646 647 647 return size; 648 648 } … … 653 653 size_t size = loc_count_services_internal(exch, ns_handle); 654 654 loc_exchange_end(exch); 655 655 656 656 return size; 657 657 } … … 664 664 size_t count = loc_count_namespaces_internal(exch); 665 665 loc_exchange_end(exch); 666 666 667 667 if (count == 0) 668 668 return 0; 669 669 670 670 loc_sdesc_t *devs = (loc_sdesc_t *) calloc(count, sizeof(loc_sdesc_t)); 671 671 if (devs == NULL) 672 672 return 0; 673 673 674 674 exch = loc_exchange_begin(INTERFACE_LOC_CONSUMER); 675 675 676 676 ipc_call_t answer; 677 677 aid_t req = async_send_0(exch, LOC_GET_NAMESPACES, &answer); 678 678 errno_t rc = async_data_read_start(exch, devs, count * sizeof(loc_sdesc_t)); 679 679 680 680 loc_exchange_end(exch); 681 681 682 682 if (rc == EOVERFLOW) { 683 683 /* … … 688 688 continue; 689 689 } 690 690 691 691 if (rc != EOK) { 692 692 async_forget(req); … … 694 694 return 0; 695 695 } 696 696 697 697 errno_t retval; 698 698 async_wait_for(req, &retval); 699 699 700 700 if (retval != EOK) 701 701 return 0; 702 702 703 703 *data = devs; 704 704 return count; … … 713 713 size_t count = loc_count_services_internal(exch, ns_handle); 714 714 loc_exchange_end(exch); 715 715 716 716 if (count == 0) 717 717 return 0; 718 718 719 719 loc_sdesc_t *devs = (loc_sdesc_t *) calloc(count, sizeof(loc_sdesc_t)); 720 720 if (devs == NULL) 721 721 return 0; 722 722 723 723 exch = loc_exchange_begin(INTERFACE_LOC_CONSUMER); 724 724 725 725 ipc_call_t answer; 726 726 aid_t req = async_send_1(exch, LOC_GET_SERVICES, ns_handle, &answer); 727 727 errno_t rc = async_data_read_start(exch, devs, count * sizeof(loc_sdesc_t)); 728 728 729 729 loc_exchange_end(exch); 730 730 731 731 if (rc == EOVERFLOW) { 732 732 /* … … 737 737 continue; 738 738 } 739 739 740 740 if (rc != EOK) { 741 741 async_forget(req); … … 743 743 return 0; 744 744 } 745 745 746 746 errno_t retval; 747 747 async_wait_for(req, &retval); 748 748 749 749 if (retval != EOK) 750 750 return 0; 751 751 752 752 *data = devs; 753 753 return count; … … 763 763 aid_t req = async_send_1(exch, method, arg1, &answer); 764 764 errno_t rc = async_data_read_start(exch, id_buf, buf_size); 765 766 loc_exchange_end(exch); 767 765 766 loc_exchange_end(exch); 767 768 768 if (rc != EOK) { 769 769 async_forget(req); 770 770 return rc; 771 771 } 772 772 773 773 errno_t retval; 774 774 async_wait_for(req, &retval); 775 776 if (retval != EOK) { 777 return retval; 778 } 779 775 776 if (retval != EOK) { 777 return retval; 778 } 779 780 780 *act_size = IPC_GET_ARG1(answer); 781 781 return EOK; … … 797 797 *data = NULL; 798 798 *count = 0; 799 799 800 800 size_t act_size = 0; 801 801 errno_t rc = loc_category_get_ids_once(method, arg1, NULL, 0, … … 803 803 if (rc != EOK) 804 804 return rc; 805 805 806 806 size_t alloc_size = act_size; 807 807 service_id_t *ids = malloc(alloc_size); 808 808 if (ids == NULL) 809 809 return ENOMEM; 810 810 811 811 while (true) { 812 812 rc = loc_category_get_ids_once(method, arg1, ids, alloc_size, … … 814 814 if (rc != EOK) 815 815 return rc; 816 816 817 817 if (act_size <= alloc_size) 818 818 break; 819 819 820 820 alloc_size = act_size; 821 821 ids = realloc(ids, alloc_size); … … 823 823 return ENOMEM; 824 824 } 825 825 826 826 *count = act_size / sizeof(category_id_t); 827 827 *data = ids; … … 866 866 return EIO; 867 867 } 868 868 869 869 cat_change_cb = cb_fun; 870 870 fibril_mutex_unlock(&loc_callback_mutex); 871 871 872 872 return EOK; 873 873 }
Note:
See TracChangeset
for help on using the changeset viewer.