Browse Source

Invalidating work after longpoll made hash_pop return no work giving a false positive for dead pool.
Rework hash_pop to retry while finds no staged work until the abstime timeout really expires.

Con Kolivas 14 years ago
parent
commit
12afb479d3
1 changed files with 10 additions and 18 deletions
  1. 10 18
      main.c

+ 10 - 18
main.c

@@ -4087,31 +4087,23 @@ static bool queue_request(struct thr_info *thr, bool needed)
 	return true;
 }
 
-struct work *hash_pop(const struct timespec *abstime)
+static struct work *hash_pop(const struct timespec *abstime)
 {
 	struct work *work = NULL;
-	int rc;
+	int rc = 0;
 
 	mutex_lock(stgd_lock);
-	if (HASH_COUNT(staged_work))
-		goto pop;
-
-	if (abstime)
+	while (!getq->frozen && !HASH_COUNT(staged_work) && !rc)
 		rc = pthread_cond_timedwait(&getq->cond, stgd_lock, abstime);
-	else
-		rc = pthread_cond_wait(&getq->cond, stgd_lock);
-	if (rc)
-		goto out;
-	if (!HASH_COUNT(staged_work))
-		goto out;
 
-pop:
-	work = staged_work;
-	HASH_DEL(staged_work, work);
-	if (work->clone)
-		--staged_clones;
-out:
+	if (HASH_COUNT(staged_work)) {
+		work = staged_work;
+		HASH_DEL(staged_work, work);
+		if (work->clone)
+			--staged_clones;
+	}
 	mutex_unlock(stgd_lock);
+
 	return work;
 }