/* Notify system that a shared object is not longer needed. */ void __gconv_release_shlib (struct __gconv_loaded_object *handle) { /* Urgh, this is ugly but we have no other possibility. */ release_handle = handle; /* Process all entries. Please note that we also visit entries with release counts <= 0. This way we can finally unload them if necessary. */ __twalk (loaded, (__action_fn_t) do_release_shlib); }
int sem_close (sem_t *sem) { int result = 0; /* Get the lock. */ lll_lock (__sem_mappings_lock, LLL_PRIVATE); /* Locate the entry for the mapping the caller provided. */ rec = NULL; the_sem = sem; __twalk (__sem_mappings, walker); if (rec != NULL) { /* Check the reference counter. If it is going to be zero, free all the resources. */ if (--rec->refcnt == 0) { /* Remove the record from the tree. */ (void) __tdelete (rec, &__sem_mappings, __sem_search); result = munmap (rec->sem, sizeof (sem_t)); free (rec); } } else { /* This is no valid semaphore. */ result = -1; __set_errno (EINVAL); } /* Release the lock. */ lll_unlock (__sem_mappings_lock, LLL_PRIVATE); return result; }
print_all (void) { __twalk (loaded, do_print); }