Browse Source

Prevent a deadlock with use of restart_threads by spawning a thread to send the driver flush work messages.

Conflicts:
	cgminer.c
nfactor-troky
Con Kolivas 11 years ago committed by Noel Maersk
parent
commit
7dd8b316ac
  1. 16
      cgminer.c

16
cgminer.c

@ -3671,12 +3671,14 @@ int restart_wait(struct thr_info *thr, unsigned int mstime)
static void flush_queue(struct cgpu_info *cgpu); static void flush_queue(struct cgpu_info *cgpu);
static void restart_threads(void) static void *restart_thread(void __maybe_unused *arg)
{ {
struct pool *cp = current_pool(); struct pool *cp = current_pool();
struct cgpu_info *cgpu; struct cgpu_info *cgpu;
int i, mt; int i, mt;
pthread_detach(pthread_self());
/* Artificially set the lagging flag to avoid pool not providing work /* Artificially set the lagging flag to avoid pool not providing work
* fast enough messages after every long poll */ * fast enough messages after every long poll */
pool_tset(cp, &cp->lagging); pool_tset(cp, &cp->lagging);
@ -3702,6 +3704,18 @@ static void restart_threads(void)
mutex_lock(&restart_lock); mutex_lock(&restart_lock);
pthread_cond_broadcast(&restart_cond); pthread_cond_broadcast(&restart_cond);
mutex_unlock(&restart_lock); mutex_unlock(&restart_lock);
return NULL;
}
/* In order to prevent a deadlock via the various drv->flush_work
* implementations we send the restart messages via a separate thread. */
static void restart_threads(void)
{
pthread_t rthread;
if (unlikely(pthread_create(&rthread, NULL, restart_thread, NULL)))
quit(1, "Failed to create restart thread");
} }
static void signal_work_update(void) static void signal_work_update(void)

Loading…
Cancel
Save