Changes in uspace/srv/loc/loc.c [278ac72:d0dd7b5] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/loc/loc.c
r278ac72 rd0dd7b5 44 44 #include <bool.h> 45 45 #include <fibril_synch.h> 46 #include <macros.h> 46 47 #include <stdlib.h> 47 48 #include <str.h> … … 66 67 **/ 67 68 68 staticFIBRIL_MUTEX_INITIALIZE(services_list_mutex);69 FIBRIL_MUTEX_INITIALIZE(services_list_mutex); 69 70 static FIBRIL_CONDVAR_INITIALIZE(services_list_cv); 70 71 static FIBRIL_MUTEX_INITIALIZE(servers_list_mutex); … … 83 84 /** Service directory ogranized by categories (yellow pages) */ 84 85 static categ_dir_t cdir; 86 87 static FIBRIL_MUTEX_INITIALIZE(callback_sess_mutex); 88 static async_sess_t *callback_sess = NULL; 85 89 86 90 service_id_t loc_create_id(void) … … 307 311 { 308 312 assert(fibril_mutex_is_locked(&services_list_mutex)); 309 313 assert(fibril_mutex_is_locked(&cdir.mutex)); 314 310 315 loc_namespace_delref(service->namespace); 311 316 list_remove(&(service->services)); 312 317 list_remove(&(service->server_services)); 318 319 /* Remove service from all categories. */ 320 while (!list_empty(&service->cat_memb)) { 321 link_t *link = list_first(&service->cat_memb); 322 svc_categ_t *memb = list_get_instance(link, svc_categ_t, 323 svc_link); 324 fibril_mutex_lock(&memb->cat->mutex); 325 category_remove_service(memb); 326 fibril_mutex_unlock(&memb->cat->mutex); 327 } 313 328 314 329 free(service->name); … … 411 426 fibril_mutex_lock(&services_list_mutex); 412 427 fibril_mutex_lock(&server->services_mutex); 428 fibril_mutex_lock(&cdir.mutex); 413 429 414 430 while (!list_empty(&server->services)) { … … 419 435 } 420 436 437 fibril_mutex_unlock(&cdir.mutex); 421 438 fibril_mutex_unlock(&server->services_mutex); 422 439 fibril_mutex_unlock(&services_list_mutex); … … 488 505 link_initialize(&service->services); 489 506 link_initialize(&service->server_services); 507 list_initialize(&service->cat_memb); 490 508 491 509 /* Check that service is not already registered */ … … 525 543 * 526 544 */ 527 static intloc_service_unregister(ipc_callid_t iid, ipc_call_t *icall,545 static void loc_service_unregister(ipc_callid_t iid, ipc_call_t *icall, 528 546 loc_server_t *server) 529 547 { 530 /* TODO */ 531 return EOK; 548 loc_service_t *svc; 549 550 fibril_mutex_lock(&services_list_mutex); 551 svc = loc_service_find_id(IPC_GET_ARG1(*icall)); 552 if (svc == NULL) { 553 fibril_mutex_unlock(&services_list_mutex); 554 async_answer_0(iid, ENOENT); 555 return; 556 } 557 558 fibril_mutex_lock(&cdir.mutex); 559 loc_service_unregister_core(svc); 560 fibril_mutex_unlock(&cdir.mutex); 561 fibril_mutex_unlock(&services_list_mutex); 562 async_answer_0(iid, EOK); 563 } 564 565 static void loc_category_get_name(ipc_callid_t iid, ipc_call_t *icall) 566 { 567 ipc_callid_t callid; 568 size_t size; 569 size_t act_size; 570 category_t *cat; 571 572 if (!async_data_read_receive(&callid, &size)) { 573 async_answer_0(callid, EREFUSED); 574 async_answer_0(iid, EREFUSED); 575 return; 576 } 577 578 fibril_mutex_lock(&cdir.mutex); 579 580 cat = category_get(&cdir, IPC_GET_ARG1(*icall)); 581 if (cat == NULL) { 582 fibril_mutex_unlock(&cdir.mutex); 583 async_answer_0(callid, ENOENT); 584 async_answer_0(iid, ENOENT); 585 return; 586 } 587 588 act_size = str_size(cat->name); 589 if (act_size > size) { 590 fibril_mutex_unlock(&cdir.mutex); 591 async_answer_0(callid, EOVERFLOW); 592 async_answer_0(iid, EOVERFLOW); 593 return; 594 } 595 596 sysarg_t retval = async_data_read_finalize(callid, cat->name, 597 min(size, act_size)); 598 599 fibril_mutex_unlock(&cdir.mutex); 600 601 async_answer_0(iid, retval); 602 } 603 604 static void loc_service_get_name(ipc_callid_t iid, ipc_call_t *icall) 605 { 606 ipc_callid_t callid; 607 size_t size; 608 size_t act_size; 609 loc_service_t *svc; 610 611 if (!async_data_read_receive(&callid, &size)) { 612 async_answer_0(callid, EREFUSED); 613 async_answer_0(iid, EREFUSED); 614 return; 615 } 616 617 fibril_mutex_lock(&services_list_mutex); 618 619 svc = loc_service_find_id(IPC_GET_ARG1(*icall)); 620 if (svc == NULL) { 621 fibril_mutex_unlock(&services_list_mutex); 622 async_answer_0(callid, ENOENT); 623 async_answer_0(iid, ENOENT); 624 return; 625 } 626 627 act_size = str_size(svc->name); 628 if (act_size > size) { 629 fibril_mutex_unlock(&services_list_mutex); 630 async_answer_0(callid, EOVERFLOW); 631 async_answer_0(iid, EOVERFLOW); 632 return; 633 } 634 635 sysarg_t retval = async_data_read_finalize(callid, svc->name, 636 min(size, act_size)); 637 638 fibril_mutex_unlock(&services_list_mutex); 639 640 async_answer_0(iid, retval); 532 641 } 533 642 … … 687 796 * 688 797 */ 798 static void loc_callback_create(ipc_callid_t iid, ipc_call_t *icall) 799 { 800 async_sess_t *cb_sess = async_callback_receive(EXCHANGE_SERIALIZE); 801 if (cb_sess == NULL) { 802 async_answer_0(iid, ENOMEM); 803 return; 804 } 805 806 fibril_mutex_lock(&callback_sess_mutex); 807 if (callback_sess != NULL) { 808 fibril_mutex_unlock(&callback_sess_mutex); 809 async_answer_0(iid, EEXIST); 810 return; 811 } 812 813 callback_sess = cb_sess; 814 fibril_mutex_unlock(&callback_sess_mutex); 815 816 async_answer_0(iid, EOK); 817 } 818 819 void loc_category_change_event(void) 820 { 821 fibril_mutex_lock(&callback_sess_mutex); 822 823 if (callback_sess != NULL) { 824 async_exch_t *exch = async_exchange_begin(callback_sess); 825 async_msg_0(exch, LOC_EVENT_CAT_CHANGE); 826 async_exchange_end(exch); 827 } 828 829 fibril_mutex_unlock(&callback_sess_mutex); 830 } 831 832 /** Find ID for category specified by name. 833 * 834 * On success, answer will contain EOK int retval and service ID in arg1. 835 * On failure, error code will be sent in retval. 836 * 837 */ 689 838 static void loc_category_get_id(ipc_callid_t iid, ipc_call_t *icall) 690 839 { … … 1054 1203 1055 1204 fibril_mutex_lock(&services_list_mutex); 1205 fibril_mutex_lock(&cdir.mutex); 1056 1206 loc_service_unregister_core(null_services[i]); 1207 fibril_mutex_unlock(&cdir.mutex); 1057 1208 fibril_mutex_unlock(&services_list_mutex); 1058 1209 … … 1088 1239 1089 1240 async_answer_0(iid, retval); 1241 1242 loc_category_change_event(); 1090 1243 } 1091 1244 … … 1115 1268 1116 1269 cat = category_new("serial"); 1270 categ_dir_add_cat(&cdir, cat); 1271 1272 cat = category_new("usbhc"); 1273 categ_dir_add_cat(&cdir, cat); 1274 1275 cat = category_new("virtual"); 1117 1276 categ_dir_add_cat(&cdir, cat); 1118 1277 … … 1197 1356 loc_service_get_id(callid, &call); 1198 1357 break; 1358 case LOC_SERVICE_GET_NAME: 1359 loc_service_get_name(callid, &call); 1360 break; 1199 1361 case LOC_NAMESPACE_GET_ID: 1200 1362 loc_namespace_get_id(callid, &call); 1201 1363 break; 1364 case LOC_CALLBACK_CREATE: 1365 loc_callback_create(callid, &call); 1366 break; 1202 1367 case LOC_CATEGORY_GET_ID: 1203 1368 loc_category_get_id(callid, &call); 1369 break; 1370 case LOC_CATEGORY_GET_NAME: 1371 loc_category_get_name(callid, &call); 1204 1372 break; 1205 1373 case LOC_CATEGORY_GET_SVCS:
Note:
See TracChangeset
for help on using the changeset viewer.