summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-02-28 08:47:21 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2014-02-28 08:50:06 +0000
commita3bfb4d3c15e6a37aba5d2f5ba92134c5186e3a4 (patch)
tree399d48874ff8113e47a7fd0820649987c7341547
parent37d080929a20bd969749c6c12d1ef4ebe236063f (diff)
sna: Reorder writes during thread task decoupling
So that the lockless reads do not see the task complete signal prior to marking the task as successful. Otherwise, we falsely detect that the thread trapped a signal and kill them all. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_threads.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/sna/sna_threads.c b/src/sna/sna_threads.c
index 089d8ab7..52fa4052 100644
--- a/src/sna/sna_threads.c
+++ b/src/sna/sna_threads.c
@@ -67,8 +67,8 @@ static void *__run__(void *arg)
t->func(t->arg);
pthread_mutex_lock(&t->mutex);
- t->func = NULL;
t->arg = NULL;
+ t->func = NULL;
pthread_cond_signal(&t->cond);
}
pthread_mutex_unlock(&t->mutex);
@@ -190,8 +190,8 @@ void sna_threads_trap(int sig)
ERR(("%s: thread[%d] caught signal %d\n", __func__, n, sig));
pthread_mutex_lock(&threads[n].mutex);
- threads[n].func = NULL;
threads[n].arg = (void *)(intptr_t)sig;
+ threads[n].func = NULL;
pthread_cond_signal(&threads[n].cond);
pthread_mutex_unlock(&threads[n].mutex);