Signed-off-by: Jens Axboe <axboe@fb.com>
-static void drop_data(struct iolog_flush_data *data, int refs)
+static void drop_data_unlock(struct iolog_flush_data *data)
+ int refs;
+
+ refs = --data->refs;
+ pthread_mutex_unlock(&data->lock);
+
if (!refs) {
free(data);
pthread_mutex_destroy(&data->lock);
if (!refs) {
free(data);
pthread_mutex_destroy(&data->lock);
ret = 0;
done:
if (data->wait) {
ret = 0;
done:
if (data->wait) {
pthread_mutex_lock(&data->lock);
data->done = 1;
pthread_cond_signal(&data->cv);
pthread_mutex_lock(&data->lock);
data->done = 1;
pthread_cond_signal(&data->cv);
- refs = --data->refs;
- pthread_mutex_unlock(&data->lock);
- drop_data(data, refs);
+
+ drop_data_unlock(data);
} else
free(data);
return ret;
} else
free(data);
return ret;
workqueue_enqueue(&log->td->log_compress_wq, &data->work);
if (wait) {
workqueue_enqueue(&log->td->log_compress_wq, &data->work);
if (wait) {
pthread_mutex_lock(&data->lock);
while (!data->done)
pthread_cond_wait(&data->cv, &data->lock);
pthread_mutex_lock(&data->lock);
while (!data->done)
pthread_cond_wait(&data->cv, &data->lock);
- refs = --data->refs;
- pthread_mutex_unlock(&data->lock);
- drop_data(data, refs);
+
+ drop_data_unlock(data);