int fio_start_gtod_thread(void) { struct fio_mutex *mutex; pthread_attr_t attr; int ret; mutex = fio_mutex_init(FIO_MUTEX_LOCKED); if (!mutex) return 1; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, 2 * PTHREAD_STACK_MIN); ret = pthread_create(>od_thread, &attr, gtod_thread_main, mutex); pthread_attr_destroy(&attr); if (ret) { log_err("Can't create gtod thread: %s\n", strerror(ret)); goto err; } ret = pthread_detach(gtod_thread); if (ret) { log_err("Can't detach gtod thread: %s\n", strerror(ret)); goto err; } dprint(FD_MUTEX, "wait on startup_mutex\n"); fio_mutex_down(mutex); dprint(FD_MUTEX, "done waiting on startup_mutex\n"); err: fio_mutex_remove(mutex); return ret; }
static void cleanup_pool(struct pool *pool) { /* * This will also remove the temporary file we used as a backing * store, it was already unlinked */ munmap(pool->map, pool->mmap_size); if (pool->lock) fio_mutex_remove(pool->lock); }
void file_hash_exit(void) { unsigned int i, has_entries = 0; fio_mutex_down(hash_lock); for (i = 0; i < HASH_BUCKETS; i++) has_entries += !flist_empty(&file_hash[i]); fio_mutex_up(hash_lock); if (has_entries) log_err("fio: file hash not empty on exit\n"); file_hash = NULL; fio_mutex_remove(hash_lock); hash_lock = NULL; }