/* * thread to combine salvager child logs * back into the main salvageserver log */ static void * SalvageLogCleanupThread(void * arg) { struct log_cleanup_node * cleanup; assert(pthread_mutex_lock(&worker_lock) == 0); while (1) { while (queue_IsEmpty(&log_cleanup_queue)) { assert(pthread_cond_wait(&log_cleanup_queue.queue_change_cv, &worker_lock) == 0); } while (queue_IsNotEmpty(&log_cleanup_queue)) { cleanup = queue_First(&log_cleanup_queue, log_cleanup_node); queue_Remove(cleanup); assert(pthread_mutex_unlock(&worker_lock) == 0); SalvageLogCleanup(cleanup->pid); free(cleanup); assert(pthread_mutex_lock(&worker_lock) == 0); } } assert(pthread_mutex_unlock(&worker_lock) == 0); return NULL; }
/* * thread to combine salvager child logs * back into the main salvageserver log */ static void * SalvageLogCleanupThread(void * arg) { struct log_cleanup_node * cleanup; MUTEX_ENTER(&worker_lock); while (1) { while (queue_IsEmpty(&log_cleanup_queue)) { CV_WAIT(&log_cleanup_queue.queue_change_cv, &worker_lock); } while (queue_IsNotEmpty(&log_cleanup_queue)) { cleanup = queue_First(&log_cleanup_queue, log_cleanup_node); queue_Remove(cleanup); MUTEX_EXIT(&worker_lock); SalvageLogCleanup(cleanup->pid); free(cleanup); MUTEX_ENTER(&worker_lock); } } MUTEX_EXIT(&worker_lock); return NULL; }