static void quit () { player_destroy (); notifier_destroy (); hotkeys_destroy (); gtk_main_quit (); }
void *miner_thread(void *userdata) { struct thr_info *mythr = userdata; struct cgpu_info *cgpu = mythr->cgpu; struct device_drv *drv = cgpu->drv; pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); char threadname[20]; snprintf(threadname, 20, "miner_%s", cgpu->proc_repr_ns); RenameThread(threadname); if (drv->thread_init && !drv->thread_init(mythr)) { dev_error(cgpu, REASON_THREAD_FAIL_INIT); for (struct cgpu_info *slave = cgpu->next_proc; slave && !slave->threads; slave = slave->next_proc) dev_error(slave, REASON_THREAD_FAIL_INIT); __thr_being_msg(LOG_ERR, mythr, "failure, exiting"); goto out; } thread_reportout(mythr); applog(LOG_DEBUG, "Popping ping in miner thread"); notifier_read(mythr->notifier); // Wait for a notification to start cgtime(&cgpu->cgminer_stats.start_tv); if (drv->minerloop) drv->minerloop(mythr); else minerloop_scanhash(mythr); __thr_being_msg(LOG_NOTICE, mythr, "shutting down"); out: ; struct cgpu_info *proc = cgpu; do { proc->deven = DEV_DISABLED; proc->status = LIFE_DEAD2; } while ( (proc = proc->next_proc) && !proc->threads); mythr->getwork = 0; mythr->has_pth = false; cgsleep_ms(1000); if (drv->thread_shutdown) drv->thread_shutdown(mythr); notifier_destroy(mythr->notifier); return NULL; }