Changes in uspace/lib/c/generic/async.c [d7978525:bc216a0] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async.c
rd7978525 rbc216a0 114 114 #include <stdlib.h> 115 115 #include <macros.h> 116 #include "private/libc.h" 117 118 #define CLIENT_HASH_TABLE_BUCKETS 32 119 #define CONN_HASH_TABLE_BUCKETS 32 116 120 117 121 118 /** Session data */ … … 205 202 /* Client connection data */ 206 203 typedef struct { 207 link_t link;204 ht_link_t link; 208 205 209 206 task_id_t in_task_id; … … 217 214 218 215 /** Hash table link. */ 219 link_t link;216 ht_link_t link; 220 217 221 218 /** Incoming client task ID. */ … … 393 390 static LIST_INITIALIZE(timeout_list); 394 391 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 } 392 static size_t client_key_hash(void *k) 393 { 394 task_id_t key = *(task_id_t*)k; 395 return key; 396 } 397 398 static size_t client_hash(const ht_link_t *item) 399 { 400 client_t *client = hash_table_get_inst(item, client_t, link); 401 return client_key_hash(&client->in_task_id); 402 } 403 404 static bool client_key_equal(void *k, const ht_link_t *item) 405 { 406 task_id_t key = *(task_id_t*)k; 407 client_t *client = hash_table_get_inst(item, client_t, link); 408 return key == client->in_task_id; 409 } 410 416 411 417 412 /** Operations for the client hash table. */ 418 static hash_table_op erations_t client_hash_table_ops = {413 static hash_table_ops_t client_hash_table_ops = { 419 414 .hash = client_hash, 420 .compare = client_compare, 421 .remove_callback = client_remove 415 .key_hash = client_key_hash, 416 .key_equal = client_key_equal, 417 .equal = 0, 418 .remove_callback = 0 422 419 }; 423 420 … … 429 426 * 430 427 */ 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 } 428 static size_t conn_key_hash(void *key) 429 { 430 sysarg_t in_phone_hash = *(sysarg_t*)key; 431 return in_phone_hash ; 432 } 433 434 static size_t conn_hash(const ht_link_t *item) 435 { 436 connection_t *conn = hash_table_get_inst(item, connection_t, link); 437 return conn_key_hash(&conn->in_phone_hash); 438 } 439 440 static bool conn_key_equal(void *key, const ht_link_t *item) 441 { 442 sysarg_t in_phone_hash = *(sysarg_t*)key; 443 connection_t *conn = hash_table_get_inst(item, connection_t, link); 444 return (in_phone_hash == conn->in_phone_hash); 445 } 446 459 447 460 448 /** Operations for the connection hash table. */ 461 static hash_table_op erations_t conn_hash_table_ops = {449 static hash_table_ops_t conn_hash_table_ops = { 462 450 .hash = conn_hash, 463 .compare = conn_compare, 464 .remove_callback = conn_remove 451 .key_hash = conn_key_hash, 452 .key_equal = conn_key_equal, 453 .equal = 0, 454 .remove_callback = 0 465 455 }; 466 456 … … 510 500 futex_down(&async_futex); 511 501 512 unsigned long key = call->in_phone_hash; 513 link_t *hlp = hash_table_find(&conn_hash_table, &key); 502 ht_link_t *hlp = hash_table_find(&conn_hash_table, &call->in_phone_hash); 514 503 515 504 if (!hlp) { … … 518 507 } 519 508 520 connection_t *conn = hash_table_get_inst ance(hlp, connection_t, link);509 connection_t *conn = hash_table_get_inst(hlp, connection_t, link); 521 510 522 511 msg_t *msg = malloc(sizeof(*msg)); … … 698 687 static client_t *async_client_get(task_id_t client_id, bool create) 699 688 { 700 unsigned long key[2] = {701 LOWER32(client_id),702 UPPER32(client_id),703 };704 689 client_t *client = NULL; 705 690 706 691 futex_down(&async_futex); 707 link_t *lnk = hash_table_find(&client_hash_table, key);692 ht_link_t *lnk = hash_table_find(&client_hash_table, &client_id); 708 693 if (lnk) { 709 client = hash_table_get_inst ance(lnk, client_t, link);694 client = hash_table_get_inst(lnk, client_t, link); 710 695 atomic_inc(&client->refcnt); 711 696 } else if (create) { … … 716 701 717 702 atomic_set(&client->refcnt, 1); 718 hash_table_insert(&client_hash_table, key,&client->link);703 hash_table_insert(&client_hash_table, &client->link); 719 704 } 720 705 } … … 727 712 { 728 713 bool destroy; 729 unsigned long key[2] = { 730 LOWER32(client->in_task_id), 731 UPPER32(client->in_task_id) 732 }; 733 714 734 715 futex_down(&async_futex); 735 716 736 717 if (atomic_predec(&client->refcnt) == 0) { 737 hash_table_remove(&client_hash_table, key, 2);718 hash_table_remove(&client_hash_table, &client->in_task_id); 738 719 destroy = true; 739 720 } else … … 831 812 */ 832 813 futex_down(&async_futex); 833 unsigned long key = fibril_connection->in_phone_hash; 834 hash_table_remove(&conn_hash_table, &key, 1); 814 hash_table_remove(&conn_hash_table, &fibril_connection->in_phone_hash); 835 815 futex_up(&async_futex); 836 816 … … 916 896 917 897 /* Add connection to the connection hash table */ 918 unsigned long key = conn->in_phone_hash;919 898 920 899 futex_down(&async_futex); 921 hash_table_insert(&conn_hash_table, & key, &conn->link);900 hash_table_insert(&conn_hash_table, &conn->link); 922 901 futex_up(&async_futex); 923 902 … … 1111 1090 void __async_init(void) 1112 1091 { 1113 if (!hash_table_create(&client_hash_table, CLIENT_HASH_TABLE_BUCKETS, 1114 2, &client_hash_table_ops)) 1092 if (!hash_table_create(&client_hash_table, 0, 0, &client_hash_table_ops)) 1115 1093 abort(); 1116 1094 1117 if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_BUCKETS, 1118 1, &conn_hash_table_ops)) 1095 if (!hash_table_create(&conn_hash_table, 0, 0, &conn_hash_table_ops)) 1119 1096 abort(); 1120 1097 … … 2167 2144 int async_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags) 2168 2145 { 2169 return ipc_answer_3(callid, EOK, (sysarg_t) src, (sysarg_t) flags, 2170 (sysarg_t) __entry); 2146 return ipc_share_in_finalize(callid, src, flags); 2171 2147 } 2172 2148 … … 2235 2211 int async_share_out_finalize(ipc_callid_t callid, void **dst) 2236 2212 { 2237 return ipc_ answer_2(callid, EOK, (sysarg_t) __entry, (sysarg_t)dst);2213 return ipc_share_out_finalize(callid, dst); 2238 2214 } 2239 2215 … … 2319 2295 int async_data_read_finalize(ipc_callid_t callid, const void *src, size_t size) 2320 2296 { 2321 return ipc_ answer_2(callid, EOK, (sysarg_t) src, (sysarg_t)size);2297 return ipc_data_read_finalize(callid, src, size); 2322 2298 } 2323 2299 … … 2422 2398 int async_data_write_finalize(ipc_callid_t callid, void *dst, size_t size) 2423 2399 { 2424 return ipc_ answer_2(callid, EOK, (sysarg_t) dst, (sysarg_t)size);2400 return ipc_data_write_finalize(callid, dst, size); 2425 2401 } 2426 2402
Note:
See TracChangeset
for help on using the changeset viewer.