Rev 2951 | Rev 3111 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2951 | Rev 3110 | ||
|---|---|---|---|
| Line 72... | Line 72... | ||
| 72 | static futex_t unused_futex = FUTEX_INITIALIZER; |
72 | static futex_t unused_futex = FUTEX_INITIALIZER; |
| 73 | 73 | ||
| 74 | /** List of unused structures. */ |
74 | /** List of unused structures. */ |
| 75 | static LIST_INITIALIZE(unused_head); |
75 | static LIST_INITIALIZE(unused_head); |
| 76 | 76 | ||
| - | 77 | static void unused_initialize(unused_t *u, dev_handle_t dev_handle) |
|
| - | 78 | { |
|
| - | 79 | link_initialize(&u->link); |
|
| - | 80 | u->dev_handle = dev_handle; |
|
| - | 81 | u->next = 0; |
|
| - | 82 | u->remaining = ((uint64_t)((fs_index_t)-1)) + 1; |
|
| - | 83 | list_initialize(&u->freed_head); |
|
| - | 84 | } |
|
| - | 85 | ||
| 77 | /** Futex protecting the up_hash and ui_hash. */ |
86 | /** Futex protecting the up_hash and ui_hash. */ |
| 78 | static futex_t used_futex = FUTEX_INITIALIZER; |
87 | static futex_t used_futex = FUTEX_INITIALIZER; |
| 79 | 88 | ||
| 80 | /** |
89 | /** |
| 81 | * Global hash table of all used fat_idx_t structures. |
90 | * Global hash table of all used fat_idx_t structures. |
| Line 399... | Line 408... | ||
| 399 | futex_up(&used_futex); |
408 | futex_up(&used_futex); |
| 400 | 409 | ||
| 401 | return fidx; |
410 | return fidx; |
| 402 | } |
411 | } |
| 403 | 412 | ||
| - | 413 | int fat_idx_init(void) |
|
| - | 414 | { |
|
| - | 415 | if (!hash_table_create(&up_hash, UPH_BUCKETS, 3, &uph_ops)) |
|
| - | 416 | return ENOMEM; |
|
| - | 417 | if (!hash_table_create(&ui_hash, UIH_BUCKETS, 2, &uih_ops)) { |
|
| - | 418 | hash_table_destroy(&up_hash); |
|
| - | 419 | return ENOMEM; |
|
| - | 420 | } |
|
| - | 421 | return EOK; |
|
| - | 422 | } |
|
| - | 423 | ||
| - | 424 | void fat_idx_fini(void) |
|
| - | 425 | { |
|
| - | 426 | /* We assume the hash tables are empty. */ |
|
| - | 427 | hash_table_destroy(&up_hash); |
|
| - | 428 | hash_table_destroy(&ui_hash); |
|
| - | 429 | } |
|
| - | 430 | ||
| - | 431 | int fat_idx_init_by_dev_handle(dev_handle_t dev_handle) |
|
| - | 432 | { |
|
| - | 433 | unused_t *u = (unused_t *) malloc(sizeof(unused_t)); |
|
| - | 434 | if (!u) |
|
| - | 435 | return ENOMEM; |
|
| - | 436 | unused_initialize(u, dev_handle); |
|
| - | 437 | futex_down(&unused_futex); |
|
| - | 438 | list_append(&u->link, &unused_head); |
|
| - | 439 | futex_up(&unused_futex); |
|
| - | 440 | return EOK; |
|
| - | 441 | } |
|
| - | 442 | ||
| - | 443 | void fat_idx_fini_by_dev_handle(dev_handle_t dev_handle) |
|
| - | 444 | { |
|
| - | 445 | unused_t *u; |
|
| - | 446 | link_t *l; |
|
| - | 447 | ||
| - | 448 | futex_down(&unused_futex); |
|
| - | 449 | for (l = unused_head.next; l != &unused_head; l = l->next) { |
|
| - | 450 | u = list_get_instance(l, unused_t, link); |
|
| - | 451 | if (u->dev_handle == dev_handle) |
|
| - | 452 | goto hit; |
|
| - | 453 | } |
|
| - | 454 | futex_up(&unused_futex); |
|
| - | 455 | ||
| - | 456 | assert(false); /* should not happen */ |
|
| - | 457 | ||
| - | 458 | hit: |
|
| - | 459 | list_remove(&u->link); |
|
| - | 460 | futex_up(&unused_futex); |
|
| - | 461 | ||
| - | 462 | while (!list_empty(&u->freed_head)) { |
|
| - | 463 | freed_t *f; |
|
| - | 464 | f = list_get_instance(u->freed_head.next, freed_t, link); |
|
| - | 465 | list_remove(&f->link); |
|
| - | 466 | free(f); |
|
| - | 467 | } |
|
| - | 468 | free(u); |
|
| - | 469 | } |
|
| - | 470 | ||
| - | 471 | /** |
|
| - | 472 | * @} |
|
| - | 473 | */ |
|