| | 32 | #ifdef PARROT_HAS_HEADER_DLFCN |
| | 33 | |
| | 34 | struct handle_entry { |
| | 35 | void *handle; |
| | 36 | struct handle_entry *next; |
| | 37 | }; |
| | 38 | |
| | 39 | struct handle_entry *handle_list = NULL; |
| | 40 | |
| | 41 | static void |
| | 42 | push_handle_entry(void *handle) |
| | 43 | { |
| | 44 | struct handle_entry *e; |
| | 45 | |
| | 46 | e = malloc(sizeof(struct handle_entry)); |
| | 47 | if (!e) { return; } |
| | 48 | e->handle = handle; |
| | 49 | e->next = handle_list; |
| | 50 | handle_list = e; |
| | 51 | } |
| | 52 | |
| | 53 | static void * |
| | 54 | find_handle_entry(void *handle) |
| | 55 | { |
| | 56 | struct handle_entry *e; |
| | 57 | |
| | 58 | for(e = handle_list; e; e = e->next) { |
| | 59 | if (e->handle == handle) |
| | 60 | return handle; |
| | 61 | } |
| | 62 | return NULL; |
| | 63 | } |
| | 64 | |
| | 65 | static void |
| | 66 | remove_handle_entry(void *handle) |
| | 67 | { |
| | 68 | struct handle_entry *cur, *prev, *p; |
| | 69 | |
| | 70 | if (handle_list) { |
| | 71 | if (handle_list->handle == handle) { |
| | 72 | p = handle_list; |
| | 73 | handle_list = p->next; |
| | 74 | free(p); |
| | 75 | } else { |
| | 76 | for (cur = handle_list; cur; prev = cur, cur = cur->next) { |
| | 77 | if (cur->handle == handle) { |
| | 78 | prev->next = cur->next; |
| | 79 | free(cur); |
| | 80 | } |
| | 81 | } |
| | 82 | } |
| | 83 | } |
| | 84 | } |
| | 85 | #endif /* PARROT_HAS_HEADER_DLFCN */ |
| | 86 | |
| | 87 | |