Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/synch/futex.c

    r38dc82d r82cbf8c6  
    6161 */
    6262
     63#include <assert.h>
    6364#include <synch/futex.h>
    6465#include <synch/mutex.h>
     
    7374#include <genarch/mm/page_ht.h>
    7475#include <adt/cht.h>
     76#include <adt/hash.h>
    7577#include <adt/hash_table.h>
    7678#include <adt/list.h>
     
    7981#include <panic.h>
    8082#include <errno.h>
    81 
    82 #define FUTEX_HT_SIZE   1024    /* keep it a power of 2 */
    8383
    8484/** Task specific pointer to a global kernel futex object. */
     
    107107static bool find_futex_paddr(uintptr_t uaddr, uintptr_t *phys_addr);
    108108
    109 static size_t futex_ht_hash(sysarg_t *key);
    110 static bool futex_ht_compare(sysarg_t *key, size_t keys, link_t *item);
    111 static void futex_ht_remove_callback(link_t *item);
     109static size_t futex_ht_hash(const ht_link_t *item);
     110static size_t futex_ht_key_hash(void *key);
     111static bool futex_ht_key_equal(void *key, const ht_link_t *item);
     112static void futex_ht_remove_callback(ht_link_t *item);
    112113
    113114static size_t task_fut_ht_hash(const cht_link_t *link);
     
    130131
    131132/** Global kernel futex hash table operations. */
    132 static hash_table_operations_t futex_ht_ops = {
     133static hash_table_ops_t futex_ht_ops = {
    133134        .hash = futex_ht_hash,
    134         .compare = futex_ht_compare,
     135        .key_hash = futex_ht_key_hash,
     136        .key_equal = futex_ht_key_equal,
    135137        .remove_callback = futex_ht_remove_callback
    136138};
     
    148150void futex_init(void)
    149151{
    150         hash_table_create(&futex_ht, FUTEX_HT_SIZE, 1, &futex_ht_ops);
     152        hash_table_create(&futex_ht, 0, 0, &futex_ht_ops);
    151153}
    152154
     
    233235{
    234236        waitq_initialize(&futex->wq);
    235         link_initialize(&futex->ht_link);
    236237        futex->paddr = paddr;
    237238        futex->refcount = 1;
     
    241242static void futex_add_ref(futex_t *futex)
    242243{
    243         ASSERT(spinlock_locked(&futex_ht_lock));
    244         ASSERT(0 < futex->refcount);
     244        assert(spinlock_locked(&futex_ht_lock));
     245        assert(0 < futex->refcount);
    245246        ++futex->refcount;
    246247}
     
    249250static void futex_release_ref(futex_t *futex)
    250251{
    251         ASSERT(spinlock_locked(&futex_ht_lock));
    252         ASSERT(0 < futex->refcount);
     252        assert(spinlock_locked(&futex_ht_lock));
     253        assert(0 < futex->refcount);
    253254       
    254255        --futex->refcount;
    255256       
    256257        if (0 == futex->refcount) {
    257                 hash_table_remove(&futex_ht, &futex->paddr, 1);
     258                hash_table_remove(&futex_ht, &futex->paddr);
    258259        }
    259260}
     
    346347        spinlock_lock(&futex_ht_lock);
    347348       
    348         link_t *fut_link = hash_table_find(&futex_ht, &phys_addr);
     349        ht_link_t *fut_link = hash_table_find(&futex_ht, &phys_addr);
    349350       
    350351        if (fut_link) {
     
    354355        } else {
    355356                futex_initialize(futex, phys_addr);
    356                 hash_table_insert(&futex_ht, &phys_addr, &futex->ht_link);
     357                hash_table_insert(&futex_ht, &futex->ht_link);
    357358        }
    358359       
     
    436437
    437438
    438 /** Compute hash index into futex hash table.
    439  *
    440  * @param key           Address where the key (i.e. physical address of futex
    441  *                      counter) is stored.
    442  *
    443  * @return              Index into futex hash table.
    444  */
    445 size_t futex_ht_hash(sysarg_t *key)
    446 {
    447         return (*key & (FUTEX_HT_SIZE - 1));
    448 }
    449 
    450 /** Compare futex hash table item with a key.
    451  *
    452  * @param key           Address where the key (i.e. physical address of futex
    453  *                      counter) is stored.
    454  *
    455  * @return              True if the item matches the key. False otherwise.
    456  */
    457 bool futex_ht_compare(sysarg_t *key, size_t keys, link_t *item)
     439/** Return the hash of the key stored in the item */
     440size_t futex_ht_hash(const ht_link_t *item)
     441{
     442        futex_t *futex = hash_table_get_inst(item, futex_t, ht_link);
     443        return hash_mix(futex->paddr);
     444}
     445
     446/** Return the hash of the key */
     447size_t futex_ht_key_hash(void *key)
     448{
     449        uintptr_t *paddr = (uintptr_t *) key;
     450        return hash_mix(*paddr);
     451}
     452
     453/** Return true if the key is equal to the item's lookup key. */
     454bool futex_ht_key_equal(void *key, const ht_link_t *item)
     455{
     456        uintptr_t *paddr = (uintptr_t *) key;
     457        futex_t *futex = hash_table_get_inst(item, futex_t, ht_link);
     458        return *paddr == futex->paddr;
     459}
     460
     461/** Callback for removal items from futex hash table.
     462 *
     463 * @param item          Item removed from the hash table.
     464 */
     465void futex_ht_remove_callback(ht_link_t *item)
    458466{
    459467        futex_t *futex;
    460468
    461         ASSERT(keys == 1);
    462 
    463         futex = hash_table_get_instance(item, futex_t, ht_link);
    464         return *key == futex->paddr;
    465 }
    466 
    467 /** Callback for removal items from futex hash table.
    468  *
    469  * @param item          Item removed from the hash table.
    470  */
    471 void futex_ht_remove_callback(link_t *item)
    472 {
    473         futex_t *futex;
    474 
    475         futex = hash_table_get_instance(item, futex_t, ht_link);
     469        futex = hash_table_get_inst(item, futex_t, ht_link);
    476470        free(futex);
    477471}
Note: See TracChangeset for help on using the changeset viewer.