Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/async.c

    rbc216a0 rd7978525  
    114114#include <stdlib.h>
    115115#include <macros.h>
    116 
     116#include "private/libc.h"
     117
     118#define CLIENT_HASH_TABLE_BUCKETS  32
     119#define CONN_HASH_TABLE_BUCKETS    32
    117120
    118121/** Session data */
     
    202205/* Client connection data */
    203206typedef struct {
    204         ht_link_t link;
     207        link_t link;
    205208       
    206209        task_id_t in_task_id;
     
    214217       
    215218        /** Hash table link. */
    216         ht_link_t link;
     219        link_t link;
    217220       
    218221        /** Incoming client task ID. */
     
    390393static LIST_INITIALIZE(timeout_list);
    391394
    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 
     395static hash_index_t client_hash(unsigned long key[])
     396{
     397        assert(key);
     398       
     399        return (((key[0]) >> 4) % CLIENT_HASH_TABLE_BUCKETS);
     400}
     401
     402static 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
     413static void client_remove(link_t *item)
     414{
     415}
    411416
    412417/** Operations for the client hash table. */
    413 static hash_table_ops_t client_hash_table_ops = {
     418static hash_table_operations_t client_hash_table_ops = {
    414419        .hash = client_hash,
    415         .key_hash = client_key_hash,
    416         .key_equal = client_key_equal,
    417         .equal = 0,
    418         .remove_callback = 0
     420        .compare = client_compare,
     421        .remove_callback = client_remove
    419422};
    420423
     
    426429 *
    427430 */
    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 
     431static 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 */
     447static 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
     456static void conn_remove(link_t *item)
     457{
     458}
    447459
    448460/** Operations for the connection hash table. */
    449 static hash_table_ops_t conn_hash_table_ops = {
     461static hash_table_operations_t conn_hash_table_ops = {
    450462        .hash = conn_hash,
    451         .key_hash = conn_key_hash,
    452         .key_equal = conn_key_equal,
    453         .equal = 0,
    454         .remove_callback = 0
     463        .compare = conn_compare,
     464        .remove_callback = conn_remove
    455465};
    456466
     
    500510        futex_down(&async_futex);
    501511       
    502         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);
    503514       
    504515        if (!hlp) {
     
    507518        }
    508519       
    509         connection_t *conn = hash_table_get_inst(hlp, connection_t, link);
     520        connection_t *conn = hash_table_get_instance(hlp, connection_t, link);
    510521       
    511522        msg_t *msg = malloc(sizeof(*msg));
     
    687698static client_t *async_client_get(task_id_t client_id, bool create)
    688699{
     700        unsigned long key[2] = {
     701                LOWER32(client_id),
     702                UPPER32(client_id),
     703        };
    689704        client_t *client = NULL;
    690705
    691706        futex_down(&async_futex);
    692         ht_link_t *lnk = hash_table_find(&client_hash_table, &client_id);
     707        link_t *lnk = hash_table_find(&client_hash_table, key);
    693708        if (lnk) {
    694                 client = hash_table_get_inst(lnk, client_t, link);
     709                client = hash_table_get_instance(lnk, client_t, link);
    695710                atomic_inc(&client->refcnt);
    696711        } else if (create) {
     
    701716               
    702717                        atomic_set(&client->refcnt, 1);
    703                         hash_table_insert(&client_hash_table, &client->link);
     718                        hash_table_insert(&client_hash_table, key, &client->link);
    704719                }
    705720        }
     
    712727{
    713728        bool destroy;
    714 
     729        unsigned long key[2] = {
     730                LOWER32(client->in_task_id),
     731                UPPER32(client->in_task_id)
     732        };
     733       
    715734        futex_down(&async_futex);
    716735       
    717736        if (atomic_predec(&client->refcnt) == 0) {
    718                 hash_table_remove(&client_hash_table, &client->in_task_id);
     737                hash_table_remove(&client_hash_table, key, 2);
    719738                destroy = true;
    720739        } else
     
    812831         */
    813832        futex_down(&async_futex);
    814         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);
    815835        futex_up(&async_futex);
    816836       
     
    896916       
    897917        /* Add connection to the connection hash table */
     918        unsigned long key = conn->in_phone_hash;
    898919       
    899920        futex_down(&async_futex);
    900         hash_table_insert(&conn_hash_table, &conn->link);
     921        hash_table_insert(&conn_hash_table, &key, &conn->link);
    901922        futex_up(&async_futex);
    902923       
     
    10901111void __async_init(void)
    10911112{
    1092         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))
    10931115                abort();
    10941116       
    1095         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))
    10961119                abort();
    10971120       
     
    21442167int async_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags)
    21452168{
    2146         return ipc_share_in_finalize(callid, src, flags);
     2169        return ipc_answer_3(callid, EOK, (sysarg_t) src, (sysarg_t) flags,
     2170            (sysarg_t) __entry);
    21472171}
    21482172
     
    22112235int async_share_out_finalize(ipc_callid_t callid, void **dst)
    22122236{
    2213         return ipc_share_out_finalize(callid, dst);
     2237        return ipc_answer_2(callid, EOK, (sysarg_t) __entry, (sysarg_t) dst);
    22142238}
    22152239
     
    22952319int async_data_read_finalize(ipc_callid_t callid, const void *src, size_t size)
    22962320{
    2297         return ipc_data_read_finalize(callid, src, size);
     2321        return ipc_answer_2(callid, EOK, (sysarg_t) src, (sysarg_t) size);
    22982322}
    22992323
     
    23982422int async_data_write_finalize(ipc_callid_t callid, void *dst, size_t size)
    23992423{
    2400         return ipc_data_write_finalize(callid, dst, size);
     2424        return ipc_answer_2(callid, EOK, (sysarg_t) dst, (sysarg_t) size);
    24012425}
    24022426
Note: See TracChangeset for help on using the changeset viewer.