Browse Source

Stage work outside of the stgd lock to prevent attempted recursive locking in clone_available.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
93e3c16aa8
  1. 7
      cgminer.c

7
cgminer.c

@ -3000,7 +3000,7 @@ static void stage_work(struct work *work);
static bool clone_available(void) static bool clone_available(void)
{ {
struct work *work, *tmp; struct work *work_clone = NULL, *work, *tmp;
bool cloned = false; bool cloned = false;
mutex_lock(stgd_lock); mutex_lock(stgd_lock);
@ -3009,13 +3009,10 @@ static bool clone_available(void)
HASH_ITER(hh, staged_work, work, tmp) { HASH_ITER(hh, staged_work, work, tmp) {
if (can_roll(work) && should_roll(work)) { if (can_roll(work) && should_roll(work)) {
struct work *work_clone;
roll_work(work); roll_work(work);
work_clone = make_clone(work); work_clone = make_clone(work);
roll_work(work); roll_work(work);
applog(LOG_DEBUG, "Pushing cloned available work to stage thread"); applog(LOG_DEBUG, "Pushing cloned available work to stage thread");
stage_work(work_clone);
cloned = true; cloned = true;
break; break;
} }
@ -3024,6 +3021,8 @@ static bool clone_available(void)
out_unlock: out_unlock:
mutex_unlock(stgd_lock); mutex_unlock(stgd_lock);
if (cloned)
stage_work(work_clone);
return cloned; return cloned;
} }

Loading…
Cancel
Save