Changes in uspace/lib/c/generic/async.c [cdc8ee2d:58cbf8d5] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async.c
rcdc8ee2d r58cbf8d5 98 98 #include <ipc/ipc.h> 99 99 #include <async.h> 100 #include "private/async.h" 100 101 #undef LIBC_ASYNC_C_ 101 102 … … 112 113 #include <mem.h> 113 114 #include <stdlib.h> 114 #include "private/async.h"115 #include <macros.h> 115 116 116 117 #define CLIENT_HASH_TABLE_BUCKETS 32 … … 138 139 link_t link; 139 140 140 sysarg_t in_task_hash;141 task_id_t in_task_id; 141 142 atomic_t refcnt; 142 143 void *data; … … 150 151 link_t link; 151 152 152 /** Incoming client task hash. */153 sysarg_t in_task_hash;153 /** Incoming client task ID. */ 154 task_id_t in_task_id; 154 155 155 156 /** Incoming phone hash. */ … … 283 284 { 284 285 assert(key); 286 assert(keys == 2); 285 287 assert(item); 286 288 287 289 client_t *client = hash_table_get_instance(item, client_t, link); 288 return (key[0] == client->in_task_hash); 290 return (key[0] == LOWER32(client->in_task_id) && 291 (key[1] == UPPER32(client->in_task_id))); 289 292 } 290 293 … … 574 577 } 575 578 576 static client_t *async_client_get(sysarg_t client_hash, bool create) 577 { 578 unsigned long key = client_hash; 579 static client_t *async_client_get(task_id_t client_id, bool create) 580 { 581 unsigned long key[2] = { 582 LOWER32(client_id), 583 UPPER32(client_id), 584 }; 579 585 client_t *client = NULL; 580 586 581 587 futex_down(&async_futex); 582 link_t *lnk = hash_table_find(&client_hash_table, &key);588 link_t *lnk = hash_table_find(&client_hash_table, key); 583 589 if (lnk) { 584 590 client = hash_table_get_instance(lnk, client_t, link); … … 587 593 client = malloc(sizeof(client_t)); 588 594 if (client) { 589 client->in_task_ hash = client_hash;595 client->in_task_id = client_id; 590 596 client->data = async_client_data_create(); 591 597 592 598 atomic_set(&client->refcnt, 1); 593 hash_table_insert(&client_hash_table, &key, &client->link);599 hash_table_insert(&client_hash_table, key, &client->link); 594 600 } 595 601 } … … 602 608 { 603 609 bool destroy; 604 unsigned long key = client->in_task_hash; 610 unsigned long key[2] = { 611 LOWER32(client->in_task_id), 612 UPPER32(client->in_task_id) 613 }; 605 614 606 615 futex_down(&async_futex); 607 616 608 617 if (atomic_predec(&client->refcnt) == 0) { 609 hash_table_remove(&client_hash_table, &key, 1);618 hash_table_remove(&client_hash_table, key, 2); 610 619 destroy = true; 611 620 } else … … 628 637 } 629 638 630 void *async_get_client_data_by_ hash(sysarg_t client_hash)631 { 632 client_t *client = async_client_get(client_ hash, false);639 void *async_get_client_data_by_id(task_id_t client_id) 640 { 641 client_t *client = async_client_get(client_id, false); 633 642 if (!client) 634 643 return NULL; … … 641 650 } 642 651 643 void async_put_client_data_by_ hash(sysarg_t client_hash)644 { 645 client_t *client = async_client_get(client_ hash, false);652 void async_put_client_data_by_id(task_id_t client_id) 653 { 654 client_t *client = async_client_get(client_id, false); 646 655 647 656 assert(client); … … 680 689 */ 681 690 682 client_t *client = async_client_get(fibril_connection->in_task_ hash, true);691 client_t *client = async_client_get(fibril_connection->in_task_id, true); 683 692 if (!client) { 684 693 ipc_answer_0(fibril_connection->callid, ENOMEM); … … 737 746 * particular fibrils. 738 747 * 739 * @param in_task_ hashIdentification of the incoming connection.748 * @param in_task_id Identification of the incoming connection. 740 749 * @param in_phone_hash Identification of the incoming connection. 741 750 * @param callid Hash of the opening IPC_M_CONNECT_ME_TO call. … … 751 760 * 752 761 */ 753 fid_t async_new_connection( sysarg_t in_task_hash, sysarg_t in_phone_hash,762 fid_t async_new_connection(task_id_t in_task_id, sysarg_t in_phone_hash, 754 763 ipc_callid_t callid, ipc_call_t *call, 755 764 async_client_conn_t cfibril, void *carg) … … 763 772 } 764 773 765 conn->in_task_ hash = in_task_hash;774 conn->in_task_id = in_task_id; 766 775 conn->in_phone_hash = in_phone_hash; 767 776 list_initialize(&conn->msg_queue); … … 822 831 case IPC_M_CONNECT_ME_TO: 823 832 /* Open new connection with fibril, etc. */ 824 async_new_connection(call->in_task_ hash, IPC_GET_ARG5(*call),833 async_new_connection(call->in_task_id, IPC_GET_ARG5(*call), 825 834 callid, call, client_connection, NULL); 826 835 return; … … 970 979 { 971 980 if (!hash_table_create(&client_hash_table, CLIENT_HASH_TABLE_BUCKETS, 972 1, &client_hash_table_ops))981 2, &client_hash_table_ops)) 973 982 abort(); 974 983 … … 986 995 session_ns->arg2 = 0; 987 996 session_ns->arg3 = 0; 997 998 fibril_mutex_initialize(&session_ns->remote_state_mtx); 999 session_ns->remote_state_data = NULL; 988 1000 989 1001 list_initialize(&session_ns->exch_list); … … 1463 1475 return ENOENT; 1464 1476 1465 sysarg_t task_hash;1466 1477 sysarg_t phone_hash; 1467 int rc = async_req_3_5(exch, IPC_M_CONNECT_TO_ME, arg1, arg2, arg3, 1468 NULL, NULL, NULL, &task_hash, &phone_hash); 1478 sysarg_t rc; 1479 1480 aid_t req; 1481 ipc_call_t answer; 1482 req = async_send_3(exch, IPC_M_CONNECT_TO_ME, arg1, arg2, arg3, 1483 &answer); 1484 async_wait_for(req, &rc); 1469 1485 if (rc != EOK) 1470 return rc; 1471 1486 return (int) rc; 1487 1488 phone_hash = IPC_GET_ARG5(answer); 1489 1472 1490 if (client_receiver != NULL) 1473 async_new_connection( task_hash, phone_hash, 0, NULL,1491 async_new_connection(answer.in_task_id, phone_hash, 0, NULL, 1474 1492 client_receiver, carg); 1475 1493 … … 1546 1564 sess->arg3 = 0; 1547 1565 1566 fibril_mutex_initialize(&sess->remote_state_mtx); 1567 sess->remote_state_data = NULL; 1568 1548 1569 list_initialize(&sess->exch_list); 1549 1570 fibril_mutex_initialize(&sess->mutex); … … 1627 1648 sess->arg3 = arg3; 1628 1649 1650 fibril_mutex_initialize(&sess->remote_state_mtx); 1651 sess->remote_state_data = NULL; 1652 1629 1653 list_initialize(&sess->exch_list); 1630 1654 fibril_mutex_initialize(&sess->mutex); … … 1677 1701 sess->arg3 = arg3; 1678 1702 1703 fibril_mutex_initialize(&sess->remote_state_mtx); 1704 sess->remote_state_data = NULL; 1705 1679 1706 list_initialize(&sess->exch_list); 1680 1707 fibril_mutex_initialize(&sess->mutex); … … 1707 1734 sess->arg2 = 0; 1708 1735 sess->arg3 = 0; 1736 1737 fibril_mutex_initialize(&sess->remote_state_mtx); 1738 sess->remote_state_data = NULL; 1709 1739 1710 1740 list_initialize(&sess->exch_list); … … 2371 2401 sess->arg3 = 0; 2372 2402 2403 fibril_mutex_initialize(&sess->remote_state_mtx); 2404 sess->remote_state_data = NULL; 2405 2373 2406 list_initialize(&sess->exch_list); 2374 2407 fibril_mutex_initialize(&sess->mutex); … … 2417 2450 sess->arg3 = 0; 2418 2451 2452 fibril_mutex_initialize(&sess->remote_state_mtx); 2453 sess->remote_state_data = NULL; 2454 2419 2455 list_initialize(&sess->exch_list); 2420 2456 fibril_mutex_initialize(&sess->mutex); … … 2458 2494 sess->arg2 = 0; 2459 2495 sess->arg3 = 0; 2496 2497 fibril_mutex_initialize(&sess->remote_state_mtx); 2498 sess->remote_state_data = NULL; 2460 2499 2461 2500 list_initialize(&sess->exch_list); … … 2499 2538 } 2500 2539 2540 /** Lock and get session remote state 2541 * 2542 * Lock and get the local replica of the remote state 2543 * in stateful sessions. The call should be paired 2544 * with async_remote_state_release*(). 2545 * 2546 * @param[in] sess Stateful session. 2547 * 2548 * @return Local replica of the remote state. 2549 * 2550 */ 2551 void *async_remote_state_acquire(async_sess_t *sess) 2552 { 2553 fibril_mutex_lock(&sess->remote_state_mtx); 2554 return sess->remote_state_data; 2555 } 2556 2557 /** Update the session remote state 2558 * 2559 * Update the local replica of the remote state 2560 * in stateful sessions. The remote state must 2561 * be already locked. 2562 * 2563 * @param[in] sess Stateful session. 2564 * @param[in] state New local replica of the remote state. 2565 * 2566 */ 2567 void async_remote_state_update(async_sess_t *sess, void *state) 2568 { 2569 assert(fibril_mutex_is_locked(&sess->remote_state_mtx)); 2570 sess->remote_state_data = state; 2571 } 2572 2573 /** Release the session remote state 2574 * 2575 * Unlock the local replica of the remote state 2576 * in stateful sessions. 2577 * 2578 * @param[in] sess Stateful session. 2579 * 2580 */ 2581 void async_remote_state_release(async_sess_t *sess) 2582 { 2583 assert(fibril_mutex_is_locked(&sess->remote_state_mtx)); 2584 2585 fibril_mutex_unlock(&sess->remote_state_mtx); 2586 } 2587 2588 /** Release the session remote state and end an exchange 2589 * 2590 * Unlock the local replica of the remote state 2591 * in stateful sessions. This is convenience function 2592 * which gets the session pointer from the exchange 2593 * and also ends the exchange. 2594 * 2595 * @param[in] exch Stateful session's exchange. 2596 * 2597 */ 2598 void async_remote_state_release_exchange(async_exch_t *exch) 2599 { 2600 if (exch == NULL) 2601 return; 2602 2603 async_sess_t *sess = exch->sess; 2604 assert(fibril_mutex_is_locked(&sess->remote_state_mtx)); 2605 2606 async_exchange_end(exch); 2607 fibril_mutex_unlock(&sess->remote_state_mtx); 2608 } 2609 2501 2610 /** @} 2502 2611 */
Note:
See TracChangeset
for help on using the changeset viewer.