/* Self-locked. Not multiple-caller safe */ void pa_memimport_free(pa_memimport *i) { pa_memexport *e; pa_memblock *b; pa_assert(i); pa_mutex_lock(i->mutex); while ((b = pa_hashmap_first(i->blocks))) memblock_replace_import(b); pa_assert(pa_hashmap_size(i->segments) == 0); pa_mutex_unlock(i->mutex); pa_mutex_lock(i->pool->mutex); /* If we've exported this block further we need to revoke that export */ for (e = i->pool->exports; e; e = e->next) memexport_revoke_blocks(e, i); PA_LLIST_REMOVE(pa_memimport, i->pool->imports, i); pa_mutex_unlock(i->pool->mutex); pa_hashmap_free(i->blocks); pa_hashmap_free(i->segments); pa_mutex_free(i->mutex); pa_xfree(i); }
void pa__done(pa_module*m) { struct userdata*u; pa_assert(m); if (!(u = m->userdata)) return; if (u->services) { struct service *s; while ((s = pa_hashmap_first(u->services))) service_free(s); pa_hashmap_free(u->services, NULL, NULL); } if (u->sink_new_slot) pa_hook_slot_free(u->sink_new_slot); if (u->source_new_slot) pa_hook_slot_free(u->source_new_slot); if (u->sink_changed_slot) pa_hook_slot_free(u->sink_changed_slot); if (u->source_changed_slot) pa_hook_slot_free(u->source_changed_slot); if (u->sink_unlink_slot) pa_hook_slot_free(u->sink_unlink_slot); if (u->source_unlink_slot) pa_hook_slot_free(u->source_unlink_slot); if (u->main_entry_group) avahi_entry_group_free(u->main_entry_group); if (u->client) avahi_client_free(u->client); if (u->avahi_poll) pa_avahi_poll_free(u->avahi_poll); if (u->native) pa_native_protocol_unref(u->native); pa_xfree(u->service_name); pa_xfree(u); }
void pa_cond_signal(pa_cond *c, int broadcast) { assert(c); if (pa_hashmap_size(c->wait_events) == 0) return; if (broadcast) SetEvent(pa_hashmap_first(c->wait_events)); else { void *iter; const void *key; HANDLE event; iter = NULL; while (1) { pa_hashmap_iterate(c->wait_events, &iter, &key); if (key == NULL) break; event = (HANDLE)pa_hashmap_get(c->wait_events, key); SetEvent(event); } } }