Changes in kernel/generic/src/synch/futex.c [38dc82d:82cbf8c6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/synch/futex.c
r38dc82d r82cbf8c6 61 61 */ 62 62 63 #include <assert.h> 63 64 #include <synch/futex.h> 64 65 #include <synch/mutex.h> … … 73 74 #include <genarch/mm/page_ht.h> 74 75 #include <adt/cht.h> 76 #include <adt/hash.h> 75 77 #include <adt/hash_table.h> 76 78 #include <adt/list.h> … … 79 81 #include <panic.h> 80 82 #include <errno.h> 81 82 #define FUTEX_HT_SIZE 1024 /* keep it a power of 2 */83 83 84 84 /** Task specific pointer to a global kernel futex object. */ … … 107 107 static bool find_futex_paddr(uintptr_t uaddr, uintptr_t *phys_addr); 108 108 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); 109 static size_t futex_ht_hash(const ht_link_t *item); 110 static size_t futex_ht_key_hash(void *key); 111 static bool futex_ht_key_equal(void *key, const ht_link_t *item); 112 static void futex_ht_remove_callback(ht_link_t *item); 112 113 113 114 static size_t task_fut_ht_hash(const cht_link_t *link); … … 130 131 131 132 /** Global kernel futex hash table operations. */ 132 static hash_table_op erations_t futex_ht_ops = {133 static hash_table_ops_t futex_ht_ops = { 133 134 .hash = futex_ht_hash, 134 .compare = futex_ht_compare, 135 .key_hash = futex_ht_key_hash, 136 .key_equal = futex_ht_key_equal, 135 137 .remove_callback = futex_ht_remove_callback 136 138 }; … … 148 150 void futex_init(void) 149 151 { 150 hash_table_create(&futex_ht, FUTEX_HT_SIZE, 1, &futex_ht_ops);152 hash_table_create(&futex_ht, 0, 0, &futex_ht_ops); 151 153 } 152 154 … … 233 235 { 234 236 waitq_initialize(&futex->wq); 235 link_initialize(&futex->ht_link);236 237 futex->paddr = paddr; 237 238 futex->refcount = 1; … … 241 242 static void futex_add_ref(futex_t *futex) 242 243 { 243 ASSERT(spinlock_locked(&futex_ht_lock));244 ASSERT(0 < futex->refcount);244 assert(spinlock_locked(&futex_ht_lock)); 245 assert(0 < futex->refcount); 245 246 ++futex->refcount; 246 247 } … … 249 250 static void futex_release_ref(futex_t *futex) 250 251 { 251 ASSERT(spinlock_locked(&futex_ht_lock));252 ASSERT(0 < futex->refcount);252 assert(spinlock_locked(&futex_ht_lock)); 253 assert(0 < futex->refcount); 253 254 254 255 --futex->refcount; 255 256 256 257 if (0 == futex->refcount) { 257 hash_table_remove(&futex_ht, &futex->paddr , 1);258 hash_table_remove(&futex_ht, &futex->paddr); 258 259 } 259 260 } … … 346 347 spinlock_lock(&futex_ht_lock); 347 348 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); 349 350 350 351 if (fut_link) { … … 354 355 } else { 355 356 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); 357 358 } 358 359 … … 436 437 437 438 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 */ 440 size_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 */ 447 size_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. */ 454 bool 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 */ 465 void futex_ht_remove_callback(ht_link_t *item) 458 466 { 459 467 futex_t *futex; 460 468 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); 476 470 free(futex); 477 471 }
Note:
See TracChangeset
for help on using the changeset viewer.