Changeset 7d7f5e3 in mainline for uspace/lib/c/generic/loc.c
- Timestamp:
- 2023-09-17T09:56:59Z (15 months ago)
- Branches:
- master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 153dd3b
- Parents:
- 4c6fd56
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/loc.c
r4c6fd56 r7d7f5e3 39 39 #include <stdbool.h> 40 40 41 static FIBRIL_MUTEX_INITIALIZE(loc_supp_block_mutex);42 41 static FIBRIL_MUTEX_INITIALIZE(loc_cons_block_mutex); 43 44 static FIBRIL_MUTEX_INITIALIZE(loc_supplier_mutex);45 42 static FIBRIL_MUTEX_INITIALIZE(loc_consumer_mutex); 46 43 … … 50 47 static void *cat_change_arg = NULL; 51 48 52 static async_sess_t *loc_supp_block_sess = NULL;53 49 static async_sess_t *loc_cons_block_sess = NULL; 54 55 static async_sess_t *loc_supplier_sess = NULL;56 50 static async_sess_t *loc_consumer_sess = NULL; 57 51 … … 108 102 if (!loc_callback_created) { 109 103 async_exch_t *exch = 110 loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);104 loc_exchange_begin_blocking(); 111 105 112 106 ipc_call_t answer; … … 135 129 /** Start an async exchange on the loc session (blocking). 136 130 * 137 * @param iface Location service interface to choose138 *139 131 * @return New exchange. 140 132 * 141 133 */ 142 async_exch_t *loc_exchange_begin_blocking(iface_t iface) 143 { 144 switch (iface) { 145 case INTERFACE_LOC_SUPPLIER: 146 fibril_mutex_lock(&loc_supp_block_mutex); 147 148 while (loc_supp_block_sess == NULL) { 149 clone_session(&loc_supplier_mutex, loc_supplier_sess, 150 &loc_supp_block_sess); 151 152 if (loc_supp_block_sess == NULL) 153 loc_supp_block_sess = 154 service_connect_blocking(SERVICE_LOC, 155 INTERFACE_LOC_SUPPLIER, 0, NULL); 156 } 157 158 fibril_mutex_unlock(&loc_supp_block_mutex); 159 160 clone_session(&loc_supplier_mutex, loc_supp_block_sess, 161 &loc_supplier_sess); 162 163 return async_exchange_begin(loc_supp_block_sess); 164 case INTERFACE_LOC_CONSUMER: 165 fibril_mutex_lock(&loc_cons_block_mutex); 166 167 while (loc_cons_block_sess == NULL) { 168 clone_session(&loc_consumer_mutex, loc_consumer_sess, 169 &loc_cons_block_sess); 170 171 if (loc_cons_block_sess == NULL) 172 loc_cons_block_sess = 173 service_connect_blocking(SERVICE_LOC, 174 INTERFACE_LOC_CONSUMER, 0, NULL); 175 } 176 177 fibril_mutex_unlock(&loc_cons_block_mutex); 178 179 clone_session(&loc_consumer_mutex, loc_cons_block_sess, 180 &loc_consumer_sess); 181 182 return async_exchange_begin(loc_cons_block_sess); 183 default: 134 async_exch_t *loc_exchange_begin_blocking(void) 135 { 136 fibril_mutex_lock(&loc_cons_block_mutex); 137 138 while (loc_cons_block_sess == NULL) { 139 clone_session(&loc_consumer_mutex, loc_consumer_sess, 140 &loc_cons_block_sess); 141 142 if (loc_cons_block_sess == NULL) 143 loc_cons_block_sess = 144 service_connect_blocking(SERVICE_LOC, 145 INTERFACE_LOC_CONSUMER, 0, NULL); 146 } 147 148 fibril_mutex_unlock(&loc_cons_block_mutex); 149 150 clone_session(&loc_consumer_mutex, loc_cons_block_sess, 151 &loc_consumer_sess); 152 153 return async_exchange_begin(loc_cons_block_sess); 154 } 155 156 /** Start an async exchange on the loc session. 157 * 158 * @return New exchange. 159 * 160 */ 161 async_exch_t *loc_exchange_begin(void) 162 { 163 fibril_mutex_lock(&loc_consumer_mutex); 164 165 if (loc_consumer_sess == NULL) 166 loc_consumer_sess = 167 service_connect(SERVICE_LOC, 168 INTERFACE_LOC_CONSUMER, 0, NULL); 169 170 fibril_mutex_unlock(&loc_consumer_mutex); 171 172 if (loc_consumer_sess == NULL) 184 173 return NULL; 185 } 186 } 187 188 /** Start an async exchange on the loc session. 189 * 190 * @param iface Location service interface to choose 191 * 192 * @return New exchange. 193 * 194 */ 195 async_exch_t *loc_exchange_begin(iface_t iface) 196 { 197 switch (iface) { 198 case INTERFACE_LOC_SUPPLIER: 199 fibril_mutex_lock(&loc_supplier_mutex); 200 201 if (loc_supplier_sess == NULL) 202 loc_supplier_sess = 203 service_connect(SERVICE_LOC, 204 INTERFACE_LOC_SUPPLIER, 0, NULL); 205 206 fibril_mutex_unlock(&loc_supplier_mutex); 207 208 if (loc_supplier_sess == NULL) 209 return NULL; 210 211 return async_exchange_begin(loc_supplier_sess); 212 case INTERFACE_LOC_CONSUMER: 213 fibril_mutex_lock(&loc_consumer_mutex); 214 215 if (loc_consumer_sess == NULL) 216 loc_consumer_sess = 217 service_connect(SERVICE_LOC, 218 INTERFACE_LOC_CONSUMER, 0, NULL); 219 220 fibril_mutex_unlock(&loc_consumer_mutex); 221 222 if (loc_consumer_sess == NULL) 223 return NULL; 224 225 return async_exchange_begin(loc_consumer_sess); 226 default: 227 return NULL; 228 } 174 175 return async_exchange_begin(loc_consumer_sess); 229 176 } 230 177 … … 240 187 241 188 /** Register new server with loc. 242 *243 * XXX Proper impementation - currently cannot actually call244 * this function more than once.245 189 * 246 190 * @param name Server name … … 257 201 return ENOMEM; 258 202 259 exch = loc_exchange_begin_blocking(INTERFACE_LOC_SUPPLIER); 203 srv->sess = service_connect_blocking(SERVICE_LOC, 204 INTERFACE_LOC_SUPPLIER, 0, NULL); 205 if (srv->sess == NULL) { 206 free(srv); 207 return ENOMEM; 208 } 209 210 exch = async_exchange_begin(srv->sess); 260 211 261 212 ipc_call_t answer; … … 265 216 if (retval != EOK) { 266 217 async_forget(req); 267 loc_exchange_end(exch); 218 async_exchange_end(exch); 219 async_hangup(srv->sess); 268 220 free(srv); 269 221 return retval; … … 278 230 */ 279 231 async_wait_for(req, &retval); 280 loc_exchange_end(exch); 281 282 if (retval != EOK) { 232 async_exchange_end(exch); 233 234 if (retval != EOK) { 235 async_hangup(srv->sess); 283 236 free(srv); 284 237 return retval; … … 293 246 * Unregister server and free server object. 294 247 * 295 * XXX Proper implementation296 *297 248 * @param srv Server object 298 249 */ 299 250 void loc_server_unregister(loc_srv_t *srv) 300 251 { 252 async_hangup(srv->sess); 301 253 free(srv); 302 254 } … … 312 264 service_id_t *sid) 313 265 { 314 async_exch_t *exch = loc_exchange_begin_blocking(INTERFACE_LOC_SUPPLIER); 315 316 (void)srv; 317 266 async_exch_t *exch = async_exchange_begin(srv->sess); 318 267 ipc_call_t answer; 319 268 aid_t req = async_send_0(exch, LOC_SERVICE_REGISTER, &answer); … … 322 271 if (retval != EOK) { 323 272 async_forget(req); 324 loc_exchange_end(exch);273 async_exchange_end(exch); 325 274 return retval; 326 275 } … … 332 281 */ 333 282 async_wait_for(req, &retval); 334 loc_exchange_end(exch);283 async_exchange_end(exch); 335 284 336 285 if (retval != EOK) { … … 357 306 errno_t retval; 358 307 359 (void)srv; 360 361 exch = loc_exchange_begin_blocking(INTERFACE_LOC_SUPPLIER); 308 exch = async_exchange_begin(srv->sess); 362 309 retval = async_req_1_0(exch, LOC_SERVICE_UNREGISTER, sid); 363 loc_exchange_end(exch);310 async_exchange_end(exch); 364 311 365 312 return (errno_t)retval; … … 372 319 373 320 if (flags & IPC_FLAG_BLOCKING) 374 exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);321 exch = loc_exchange_begin_blocking(); 375 322 else { 376 exch = loc_exchange_begin( INTERFACE_LOC_CONSUMER);323 exch = loc_exchange_begin(); 377 324 if (exch == NULL) 378 325 return errno; … … 425 372 426 373 *name = NULL; 427 exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);374 exch = loc_exchange_begin_blocking(); 428 375 429 376 ipc_call_t answer; … … 505 452 506 453 if (flags & IPC_FLAG_BLOCKING) 507 exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);454 exch = loc_exchange_begin_blocking(); 508 455 else { 509 exch = loc_exchange_begin( INTERFACE_LOC_CONSUMER);456 exch = loc_exchange_begin(); 510 457 if (exch == NULL) 511 458 return errno; … … 554 501 555 502 if (flags & IPC_FLAG_BLOCKING) 556 exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);503 exch = loc_exchange_begin_blocking(); 557 504 else { 558 exch = loc_exchange_begin( INTERFACE_LOC_CONSUMER);505 exch = loc_exchange_begin(); 559 506 if (exch == NULL) 560 507 return errno; … … 590 537 loc_object_type_t loc_id_probe(service_id_t handle) 591 538 { 592 async_exch_t *exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);539 async_exch_t *exch = loc_exchange_begin_blocking(); 593 540 594 541 sysarg_t type; … … 621 568 int loc_null_create(void) 622 569 { 623 async_exch_t *exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);570 async_exch_t *exch = loc_exchange_begin_blocking(); 624 571 625 572 sysarg_t null_id; … … 636 583 void loc_null_destroy(int null_id) 637 584 { 638 async_exch_t *exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);585 async_exch_t *exch = loc_exchange_begin_blocking(); 639 586 async_req_1_0(exch, LOC_NULL_DESTROY, (sysarg_t) null_id); 640 587 loc_exchange_end(exch); … … 665 612 errno_t retval; 666 613 667 exch = loc_exchange_begin_blocking(INTERFACE_LOC_SUPPLIER);614 exch = async_exchange_begin(srv->sess); 668 615 retval = async_req_2_0(exch, LOC_SERVICE_ADD_TO_CAT, svc_id, cat_id); 669 loc_exchange_end(exch);616 async_exchange_end(exch); 670 617 671 618 return retval; … … 686 633 size_t loc_count_namespaces(void) 687 634 { 688 async_exch_t *exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);635 async_exch_t *exch = loc_exchange_begin_blocking(); 689 636 size_t size = loc_count_namespaces_internal(exch); 690 637 loc_exchange_end(exch); … … 695 642 size_t loc_count_services(service_id_t ns_handle) 696 643 { 697 async_exch_t *exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);644 async_exch_t *exch = loc_exchange_begin_blocking(); 698 645 size_t size = loc_count_services_internal(exch, ns_handle); 699 646 loc_exchange_end(exch); … … 706 653 /* Loop until read is succesful */ 707 654 while (true) { 708 async_exch_t *exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);655 async_exch_t *exch = loc_exchange_begin_blocking(); 709 656 size_t count = loc_count_namespaces_internal(exch); 710 657 loc_exchange_end(exch); … … 717 664 return 0; 718 665 719 exch = loc_exchange_begin( INTERFACE_LOC_CONSUMER);666 exch = loc_exchange_begin(); 720 667 721 668 ipc_call_t answer; … … 755 702 /* Loop until read is succesful */ 756 703 while (true) { 757 async_exch_t *exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);704 async_exch_t *exch = loc_exchange_begin_blocking(); 758 705 size_t count = loc_count_services_internal(exch, ns_handle); 759 706 loc_exchange_end(exch); … … 766 713 return 0; 767 714 768 exch = loc_exchange_begin( INTERFACE_LOC_CONSUMER);715 exch = loc_exchange_begin(); 769 716 770 717 ipc_call_t answer; … … 803 750 sysarg_t *id_buf, size_t buf_size, size_t *act_size) 804 751 { 805 async_exch_t *exch = loc_exchange_begin_blocking( INTERFACE_LOC_CONSUMER);752 async_exch_t *exch = loc_exchange_begin_blocking(); 806 753 807 754 ipc_call_t answer;
Note:
See TracChangeset
for help on using the changeset viewer.