[PATCH 1/3] simplify the failure cleanup path of the backing store ack thread

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We don't need pthread_cancel and pthread_cond_signal here.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx>
---
 usr/bs.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/usr/bs.c b/usr/bs.c
index 542ef55..e659438 100644
--- a/usr/bs.c
+++ b/usr/bs.c
@@ -68,6 +68,9 @@ retry:
 		goto out;
 	}
 
+	if (info->stop)
+		goto out;
+
 	pthread_mutex_lock(&info->finished_lock);
 retest:
 	if (list_empty(&info->finished_list)) {
@@ -100,7 +103,7 @@ rewrite:
 
 	goto retry;
 out:
-	return NULL;
+	pthread_exit(NULL);
 }
 
 static void bs_thread_request_done(int fd, int events, void *data)
@@ -203,8 +206,10 @@ int bs_thread_open(struct bs_thread_info *info, request_func_t *rfn,
 		goto close_done_fd;
 
 	ret = pthread_create(&info->ack_thread, NULL, bs_thread_ack_fn, info);
-	if (ret)
+	if (ret) {
+		eprintf("failed to create an ack thread, %s\n", strerror(ret));
 		goto event_del;
+	}
 
 	if (nr_threads > ARRAY_SIZE(info->worker_thread)) {
 		eprintf("too many threads %d\n", nr_threads);
@@ -228,12 +233,10 @@ rewrite:
 
 	return 0;
 destroy_threads:
+	info->stop = 1;
 	write(info->command_fd[1], &ret, sizeof(ret));
-	pthread_cancel(info->ack_thread);
-	pthread_cond_signal(&info->finished_cond);
 	pthread_join(info->ack_thread, NULL);
 
-	info->stop = 1;
 	for (i = 0; info->worker_thread[i]; i++) {
 		pthread_cancel(info->worker_thread[i]);
 		pthread_cond_signal(&info->pending_cond);
-- 
1.5.5.GIT

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux SCSI]     [Linux RAID]     [Linux Clusters]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]

  Powered by Linux