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.
nfactor-troky
Con Kolivas 13 years ago
parent
commit
12afb479d3
  1. 28
      main.c

28
main.c

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

Loading…
Cancel
Save