Commit aa9938973e1410c34500992ff304c131f6fde9b2

Con Kolivas 2013-11-05T09:08:52

Use only a trylock in flush queue to prevent deadlocks.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
diff --git a/cgminer.c b/cgminer.c
index bd5a7ed..d104645 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -6614,7 +6614,13 @@ static void flush_queue(struct cgpu_info *cgpu)
 {
 	struct work *work = NULL;
 
-	wr_lock(&cgpu->qlock);
+	if (unlikely(!cgpu))
+		return;
+
+	/* Use only a trylock in case we get into a deadlock with a queueing
+	 * function holding the read lock when we're called. */
+	if (wr_trylock(&cgpu->qlock))
+		return;
 	work = cgpu->unqueued_work;
 	cgpu->unqueued_work = NULL;
 	wr_unlock(&cgpu->qlock);