summaryrefslogtreecommitdiff
path: root/src/sna/sna_threads.c
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 /src/sna/sna_threads.c
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>
Diffstat (limited to 'src/sna/sna_threads.c')
-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);