Rev 4377 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4377 | Rev 4692 | ||
|---|---|---|---|
| Line 97... | Line 97... | ||
| 97 | 97 | ||
| 98 | /** |
98 | /** |
| 99 | * Hash table operations for cases when we know that |
99 | * Hash table operations for cases when we know that |
| 100 | * there will be collisions between different keys. |
100 | * there will be collisions between different keys. |
| 101 | */ |
101 | */ |
| 102 | static index_t irq_ht_hash(unative_t *key); |
102 | static size_t irq_ht_hash(unative_t *key); |
| 103 | static bool irq_ht_compare(unative_t *key, count_t keys, link_t *item); |
103 | static bool irq_ht_compare(unative_t *key, size_t keys, link_t *item); |
| 104 | static void irq_ht_remove(link_t *item); |
104 | static void irq_ht_remove(link_t *item); |
| 105 | 105 | ||
| 106 | static hash_table_operations_t irq_ht_ops = { |
106 | static hash_table_operations_t irq_ht_ops = { |
| 107 | .hash = irq_ht_hash, |
107 | .hash = irq_ht_hash, |
| 108 | .compare = irq_ht_compare, |
108 | .compare = irq_ht_compare, |
| Line 113... | Line 113... | ||
| 113 | * Hash table operations for cases when we know that |
113 | * Hash table operations for cases when we know that |
| 114 | * there will be no collisions between different keys. |
114 | * there will be no collisions between different keys. |
| 115 | * However, there might be still collisions among |
115 | * However, there might be still collisions among |
| 116 | * elements with single key (sharing of one IRQ). |
116 | * elements with single key (sharing of one IRQ). |
| 117 | */ |
117 | */ |
| 118 | static index_t irq_lin_hash(unative_t *key); |
118 | static size_t irq_lin_hash(unative_t *key); |
| 119 | static bool irq_lin_compare(unative_t *key, count_t keys, link_t *item); |
119 | static bool irq_lin_compare(unative_t *key, size_t keys, link_t *item); |
| 120 | static void irq_lin_remove(link_t *item); |
120 | static void irq_lin_remove(link_t *item); |
| 121 | 121 | ||
| 122 | static hash_table_operations_t irq_lin_ops = { |
122 | static hash_table_operations_t irq_lin_ops = { |
| 123 | .hash = irq_lin_hash, |
123 | .hash = irq_lin_hash, |
| 124 | .compare = irq_lin_compare, |
124 | .compare = irq_lin_compare, |
| 125 | .remove_callback = irq_lin_remove, |
125 | .remove_callback = irq_lin_remove, |
| 126 | }; |
126 | }; |
| 127 | 127 | ||
| 128 | /** Number of buckets in either of the hash tables. */ |
128 | /** Number of buckets in either of the hash tables. */ |
| 129 | static count_t buckets; |
129 | static size_t buckets; |
| 130 | 130 | ||
| 131 | /** Initialize IRQ subsystem. |
131 | /** Initialize IRQ subsystem. |
| 132 | * |
132 | * |
| 133 | * @param inrs Numbers of unique IRQ numbers or INRs. |
133 | * @param inrs Numbers of unique IRQ numbers or INRs. |
| 134 | * @param chains Number of chains in the hash table. |
134 | * @param chains Number of chains in the hash table. |
| 135 | */ |
135 | */ |
| 136 | void irq_init(count_t inrs, count_t chains) |
136 | void irq_init(size_t inrs, size_t chains) |
| 137 | { |
137 | { |
| 138 | buckets = chains; |
138 | buckets = chains; |
| 139 | /* |
139 | /* |
| 140 | * Be smart about the choice of the hash table operations. |
140 | * Be smart about the choice of the hash table operations. |
| 141 | * In cases in which inrs equals the requested number of |
141 | * In cases in which inrs equals the requested number of |
| Line 296... | Line 296... | ||
| 296 | * |
296 | * |
| 297 | * @param key The first of the keys is inr and the second is devno or -1. |
297 | * @param key The first of the keys is inr and the second is devno or -1. |
| 298 | * |
298 | * |
| 299 | * @return Index into the hash table. |
299 | * @return Index into the hash table. |
| 300 | */ |
300 | */ |
| 301 | index_t irq_ht_hash(unative_t key[]) |
301 | size_t irq_ht_hash(unative_t key[]) |
| 302 | { |
302 | { |
| 303 | inr_t inr = (inr_t) key[KEY_INR]; |
303 | inr_t inr = (inr_t) key[KEY_INR]; |
| 304 | return inr % buckets; |
304 | return inr % buckets; |
| 305 | } |
305 | } |
| 306 | 306 | ||
| Line 322... | Line 322... | ||
| 322 | * @param keys This is 2. |
322 | * @param keys This is 2. |
| 323 | * @param item The item to compare the key with. |
323 | * @param item The item to compare the key with. |
| 324 | * |
324 | * |
| 325 | * @return True on match or false otherwise. |
325 | * @return True on match or false otherwise. |
| 326 | */ |
326 | */ |
| 327 | bool irq_ht_compare(unative_t key[], count_t keys, link_t *item) |
327 | bool irq_ht_compare(unative_t key[], size_t keys, link_t *item) |
| 328 | { |
328 | { |
| 329 | irq_t *irq = hash_table_get_instance(item, irq_t, link); |
329 | irq_t *irq = hash_table_get_instance(item, irq_t, link); |
| 330 | inr_t inr = (inr_t) key[KEY_INR]; |
330 | inr_t inr = (inr_t) key[KEY_INR]; |
| 331 | devno_t devno = (devno_t) key[KEY_DEVNO]; |
331 | devno_t devno = (devno_t) key[KEY_DEVNO]; |
| 332 | 332 | ||
| Line 369... | Line 369... | ||
| 369 | * |
369 | * |
| 370 | * @param key The first of the keys is inr and the second is devno or -1. |
370 | * @param key The first of the keys is inr and the second is devno or -1. |
| 371 | * |
371 | * |
| 372 | * @return Index into the hash table. |
372 | * @return Index into the hash table. |
| 373 | */ |
373 | */ |
| 374 | index_t irq_lin_hash(unative_t key[]) |
374 | size_t irq_lin_hash(unative_t key[]) |
| 375 | { |
375 | { |
| 376 | inr_t inr = (inr_t) key[KEY_INR]; |
376 | inr_t inr = (inr_t) key[KEY_INR]; |
| 377 | return inr; |
377 | return inr; |
| 378 | } |
378 | } |
| 379 | 379 | ||
| Line 395... | Line 395... | ||
| 395 | * @param keys This is 2. |
395 | * @param keys This is 2. |
| 396 | * @param item The item to compare the key with. |
396 | * @param item The item to compare the key with. |
| 397 | * |
397 | * |
| 398 | * @return True on match or false otherwise. |
398 | * @return True on match or false otherwise. |
| 399 | */ |
399 | */ |
| 400 | bool irq_lin_compare(unative_t key[], count_t keys, link_t *item) |
400 | bool irq_lin_compare(unative_t key[], size_t keys, link_t *item) |
| 401 | { |
401 | { |
| 402 | irq_t *irq = list_get_instance(item, irq_t, link); |
402 | irq_t *irq = list_get_instance(item, irq_t, link); |
| 403 | devno_t devno = (devno_t) key[KEY_DEVNO]; |
403 | devno_t devno = (devno_t) key[KEY_DEVNO]; |
| 404 | bool rv; |
404 | bool rv; |
| 405 | 405 | ||