From: laijs@cn.fujitsu.com (Lai Jiangshan)
Subject: [ltt-dev] [PATCH 3/7] urcu, defer_rcu: Avoid thread exit unexpected
Date: Wed, 28 Sep 2011 16:34:29 +0800 [thread overview]
Message-ID: <670e3da346d9f381a01cf1921075b2a5cafef2c6.1317198301.git.laijs@cn.fujitsu.com> (raw)
In-Reply-To: <cover.1317198301.git.laijs@cn.fujitsu.com>
When a cancellation was requested, the target thread will exit
when it find any cancellation points.
Pthread cancellation is useful when further operations of one or
more threads are undesirable or unnecessary.
But thr_defer() need to release all lock before exit, unexpected
exiting will break such semantic.
pthread_testcancel() is not the only function who can creates
a cancellation points. Some other functions may also have
cancellation points. Example: poll() which in synchronize_rcu().
Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
---
urcu-defer-impl.h | 18 +++++++++++++++---
1 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/urcu-defer-impl.h b/urcu-defer-impl.h
index 6339747..49570ff 100644
--- a/urcu-defer-impl.h
+++ b/urcu-defer-impl.h
@@ -122,6 +122,7 @@ static pthread_mutex_t rcu_defer_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t defer_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
static int32_t defer_thread_futex;
+static int32_t defer_thread_stop;
/*
* Written to only by each individual deferer. Read by both the deferer and
@@ -148,7 +149,6 @@ static void mutex_lock_defer(pthread_mutex_t *mutex)
perror("Error in pthread mutex lock");
exit(-1);
}
- pthread_testcancel();
poll(NULL,0,10);
}
#endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
@@ -187,7 +187,8 @@ static void wait_defer(void)
{
uatomic_dec(&defer_thread_futex);
cmm_smp_mb(); /* Write futex before read queue */
- pthread_testcancel();
+ if (defer_thread_stop)
+ pthread_exit(0);
if (rcu_defer_num_callbacks()) {
cmm_smp_mb(); /* Read queue before write futex */
/* Callbacks are queued, don't wait. */
@@ -397,10 +398,21 @@ static void stop_defer_thread(void)
int ret;
void *tret;
- pthread_cancel(tid_defer);
+ /*
+ * stop_defer_thread(): tid_defer():
+ *
+ * set defer_thread_stop set futex
+ * mb() mb()
+ * test futex and wake test defer_thread_stop and exit
+ */
+ defer_thread_stop = 1;
+ cmm_smp_mb();
wake_up_defer();
+
ret = pthread_join(tid_defer, &tret);
assert(!ret);
+
+ defer_thread_stop = 0;
}
int rcu_defer_register_thread(void)
--
1.7.4.4
next prev parent reply other threads:[~2011-09-28 8:34 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-28 8:34 [ltt-dev] [PATCH 0/7] urcu,call_rcu: minior fixes, round2 Lai Jiangshan
2011-09-28 8:34 ` [ltt-dev] [PATCH 1/7] urcu, call_rcu: protects call_rcu_data_list when remove node Lai Jiangshan
2011-09-29 17:00 ` Mathieu Desnoyers
2011-09-28 8:34 ` [ltt-dev] [PATCH 2/7] urcu, defer_rcu: fix missing respond to a cancellation request Lai Jiangshan
2011-09-29 17:13 ` Mathieu Desnoyers
2011-09-28 8:34 ` Lai Jiangshan [this message]
2011-09-29 17:27 ` [ltt-dev] [PATCH 3/7] urcu, defer_rcu: Avoid thread exit unexpected Mathieu Desnoyers
2011-09-28 8:34 ` [ltt-dev] [PATCH 4/7] urcu, defer_rcu: Simplify defer_rcu() encoding Lai Jiangshan
2011-09-29 17:49 ` Mathieu Desnoyers
2011-09-28 8:34 ` [ltt-dev] [PATCH 5/7] urcu, call_rcu: avoid create call_rcu_data for child when unneed Lai Jiangshan
2011-09-29 17:27 ` Paul E. McKenney
2011-09-29 17:52 ` Mathieu Desnoyers
2011-09-28 8:34 ` [ltt-dev] [PATCH 6/7] urcu, call_rcu: Cleanup call_rcu_data pointers before used in child Lai Jiangshan
2011-09-29 17:37 ` Paul E. McKenney
2011-09-29 17:59 ` Mathieu Desnoyers
2011-09-29 18:08 ` Paul E. McKenney
2011-09-29 18:19 ` Mathieu Desnoyers
2011-09-29 18:29 ` Paul E. McKenney
2011-09-29 18:28 ` Mathieu Desnoyers
2011-09-29 19:43 ` Mathieu Desnoyers
2011-09-29 19:53 ` Mathieu Desnoyers
2011-09-28 8:34 ` [ltt-dev] [PATCH 7/7] urcu, call_rcu: Array initialized before pointer is planted Lai Jiangshan
2011-09-29 17:33 ` Paul E. McKenney
2011-09-29 20:07 ` Mathieu Desnoyers
2011-09-29 21:13 ` Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=670e3da346d9f381a01cf1921075b2a5cafef2c6.1317198301.git.laijs@cn.fujitsu.com \
--to=laijs@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox