Changes in uspace/lib/c/generic/async.c [4e00f87:d7978525] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async.c
r4e00f87 rd7978525 116 116 #include "private/libc.h" 117 117 118 #define CLIENT_HASH_TABLE_BUCKETS 32 119 #define CONN_HASH_TABLE_BUCKETS 32 118 120 119 121 /** Session data */ … … 203 205 /* Client connection data */ 204 206 typedef struct { 205 ht_link_t link;207 link_t link; 206 208 207 209 task_id_t in_task_id; … … 215 217 216 218 /** Hash table link. */ 217 ht_link_t link;219 link_t link; 218 220 219 221 /** Incoming client task ID. */ … … 391 393 static LIST_INITIALIZE(timeout_list); 392 394 393 static size_t client_key_hash(void *k) 394 { 395 task_id_t key = *(task_id_t*)k; 396 return key; 397 } 398 399 static size_t client_hash(const ht_link_t *item) 400 { 401 client_t *client = hash_table_get_inst(item, client_t, link); 402 return client_key_hash(&client->in_task_id); 403 } 404 405 static bool client_key_equal(void *k, const ht_link_t *item) 406 { 407 task_id_t key = *(task_id_t*)k; 408 client_t *client = hash_table_get_inst(item, client_t, link); 409 return key == client->in_task_id; 410 } 411 395 static hash_index_t client_hash(unsigned long key[]) 396 { 397 assert(key); 398 399 return (((key[0]) >> 4) % CLIENT_HASH_TABLE_BUCKETS); 400 } 401 402 static int client_compare(unsigned long key[], hash_count_t keys, link_t *item) 403 { 404 assert(key); 405 assert(keys == 2); 406 assert(item); 407 408 client_t *client = hash_table_get_instance(item, client_t, link); 409 return (key[0] == LOWER32(client->in_task_id) && 410 (key[1] == UPPER32(client->in_task_id))); 411 } 412 413 static void client_remove(link_t *item) 414 { 415 } 412 416 413 417 /** Operations for the client hash table. */ 414 static hash_table_op s_t client_hash_table_ops = {418 static hash_table_operations_t client_hash_table_ops = { 415 419 .hash = client_hash, 416 .key_hash = client_key_hash, 417 .key_equal = client_key_equal, 418 .equal = NULL, 419 .remove_callback = NULL 420 .compare = client_compare, 421 .remove_callback = client_remove 420 422 }; 421 423 … … 427 429 * 428 430 */ 429 static size_t conn_key_hash(void *key) 430 { 431 sysarg_t in_phone_hash = *(sysarg_t*)key; 432 return in_phone_hash ; 433 } 434 435 static size_t conn_hash(const ht_link_t *item) 436 { 437 connection_t *conn = hash_table_get_inst(item, connection_t, link); 438 return conn_key_hash(&conn->in_phone_hash); 439 } 440 441 static bool conn_key_equal(void *key, const ht_link_t *item) 442 { 443 sysarg_t in_phone_hash = *(sysarg_t*)key; 444 connection_t *conn = hash_table_get_inst(item, connection_t, link); 445 return (in_phone_hash == conn->in_phone_hash); 446 } 447 431 static hash_index_t conn_hash(unsigned long key[]) 432 { 433 assert(key); 434 435 return (((key[0]) >> 4) % CONN_HASH_TABLE_BUCKETS); 436 } 437 438 /** Compare hash table item with a key. 439 * 440 * @param key Array containing the source phone hash as the only item. 441 * @param keys Expected 1 but ignored. 442 * @param item Connection hash table item. 443 * 444 * @return True on match, false otherwise. 445 * 446 */ 447 static int conn_compare(unsigned long key[], hash_count_t keys, link_t *item) 448 { 449 assert(key); 450 assert(item); 451 452 connection_t *conn = hash_table_get_instance(item, connection_t, link); 453 return (key[0] == conn->in_phone_hash); 454 } 455 456 static void conn_remove(link_t *item) 457 { 458 } 448 459 449 460 /** Operations for the connection hash table. */ 450 static hash_table_op s_t conn_hash_table_ops = {461 static hash_table_operations_t conn_hash_table_ops = { 451 462 .hash = conn_hash, 452 .key_hash = conn_key_hash, 453 .key_equal = conn_key_equal, 454 .equal = NULL, 455 .remove_callback = NULL 463 .compare = conn_compare, 464 .remove_callback = conn_remove 456 465 }; 457 466 … … 501 510 futex_down(&async_futex); 502 511 503 ht_link_t *hlp = hash_table_find(&conn_hash_table, &call->in_phone_hash); 512 unsigned long key = call->in_phone_hash; 513 link_t *hlp = hash_table_find(&conn_hash_table, &key); 504 514 505 515 if (!hlp) { … … 508 518 } 509 519 510 connection_t *conn = hash_table_get_inst (hlp, connection_t, link);520 connection_t *conn = hash_table_get_instance(hlp, connection_t, link); 511 521 512 522 msg_t *msg = malloc(sizeof(*msg)); … … 628 638 629 639 if (usecs) { 630 get uptime(&conn->wdata.to_event.expires);640 gettimeofday(&conn->wdata.to_event.expires, NULL); 631 641 tv_add(&conn->wdata.to_event.expires, usecs); 632 642 } else … … 688 698 static client_t *async_client_get(task_id_t client_id, bool create) 689 699 { 700 unsigned long key[2] = { 701 LOWER32(client_id), 702 UPPER32(client_id), 703 }; 690 704 client_t *client = NULL; 691 705 692 706 futex_down(&async_futex); 693 ht_link_t *lnk = hash_table_find(&client_hash_table, &client_id);707 link_t *lnk = hash_table_find(&client_hash_table, key); 694 708 if (lnk) { 695 client = hash_table_get_inst (lnk, client_t, link);709 client = hash_table_get_instance(lnk, client_t, link); 696 710 atomic_inc(&client->refcnt); 697 711 } else if (create) { … … 702 716 703 717 atomic_set(&client->refcnt, 1); 704 hash_table_insert(&client_hash_table, &client->link);718 hash_table_insert(&client_hash_table, key, &client->link); 705 719 } 706 720 } … … 713 727 { 714 728 bool destroy; 715 729 unsigned long key[2] = { 730 LOWER32(client->in_task_id), 731 UPPER32(client->in_task_id) 732 }; 733 716 734 futex_down(&async_futex); 717 735 718 736 if (atomic_predec(&client->refcnt) == 0) { 719 hash_table_remove(&client_hash_table, &client->in_task_id);737 hash_table_remove(&client_hash_table, key, 2); 720 738 destroy = true; 721 739 } else … … 813 831 */ 814 832 futex_down(&async_futex); 815 hash_table_remove(&conn_hash_table, &fibril_connection->in_phone_hash); 833 unsigned long key = fibril_connection->in_phone_hash; 834 hash_table_remove(&conn_hash_table, &key, 1); 816 835 futex_up(&async_futex); 817 836 … … 897 916 898 917 /* Add connection to the connection hash table */ 918 unsigned long key = conn->in_phone_hash; 899 919 900 920 futex_down(&async_futex); 901 hash_table_insert(&conn_hash_table, & conn->link);921 hash_table_insert(&conn_hash_table, &key, &conn->link); 902 922 futex_up(&async_futex); 903 923 … … 947 967 { 948 968 struct timeval tv; 949 get uptime(&tv);969 gettimeofday(&tv, NULL); 950 970 951 971 futex_down(&async_futex); … … 1004 1024 1005 1025 struct timeval tv; 1006 get uptime(&tv);1026 gettimeofday(&tv, NULL); 1007 1027 1008 1028 if (tv_gteq(&tv, &waiter->to_event.expires)) { … … 1091 1111 void __async_init(void) 1092 1112 { 1093 if (!hash_table_create(&client_hash_table, 0, 0, &client_hash_table_ops)) 1113 if (!hash_table_create(&client_hash_table, CLIENT_HASH_TABLE_BUCKETS, 1114 2, &client_hash_table_ops)) 1094 1115 abort(); 1095 1116 1096 if (!hash_table_create(&conn_hash_table, 0, 0, &conn_hash_table_ops)) 1117 if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_BUCKETS, 1118 1, &conn_hash_table_ops)) 1097 1119 abort(); 1098 1120 … … 1309 1331 timeout = 0; 1310 1332 1311 get uptime(&msg->wdata.to_event.expires);1333 gettimeofday(&msg->wdata.to_event.expires, NULL); 1312 1334 tv_add(&msg->wdata.to_event.expires, timeout); 1313 1335 … … 1391 1413 msg->wdata.fid = fibril_get_id(); 1392 1414 1393 get uptime(&msg->wdata.to_event.expires);1415 gettimeofday(&msg->wdata.to_event.expires, NULL); 1394 1416 tv_add(&msg->wdata.to_event.expires, timeout); 1395 1417
Note:
See TracChangeset
for help on using the changeset viewer.