void OmpMaster::HandleOtherRequests() { if (Requests.front() == "START" && State == WAITING) { GetField(); InitWorkers(); Requests.pop_front(); State = STOPPED; } else LocalWorker::HandleOtherRequests(); }
void SmpManager::DoWork(TreeNode *w,bool EvalOpt,int credit) { int i; if(w->fen[0] == '\0') { w = w; return; } if(NumThreads == 1) { // don't schedule. ThreadData[0].work.Node = w; ThreadData[0].work.EvalOptimism = EvalOpt; ThreadData[0].work.CreditNps = credit; ThreadData[0].work.DoJob(); return; } if(InitDone == false) { InitWorkers(NumThreads); // start smp threads while(!SmpWorkers.AllStarted())SmpWorkers.Sleep(); } #ifndef _MSC_VER while(true) { for(i = 0; i < NumThreads; i++) { // buscamos alguien libre if(ThreadData[i].Idle && !ThreadData[i].Start ) { ThreadData[i].work.Node = w; ThreadData[i].work.EvalOptimism = EvalOpt; ThreadData[i].work.CreditNps = credit; ThreadData[i].Start = true; // liberamos el thread pthread_mutex_lock(&ThreadData[i].WaitLock); pthread_cond_signal(&ThreadData[i].IdleEvent); pthread_mutex_unlock(&ThreadData[i].WaitLock); // esperamos a que se ponga en marcha while(ThreadData[i].Idle && ThreadData[i].Start){ Sleep(); } ThreadData[i].Start = false; return; } } // no hemos podido lanzarlo cedemos el paso a otro a ver si termina Sleep(); } #else while(true) { for(i = 0; i < NumThreads; i++) { // buscamos alguien libre if(ThreadData[i].Idle)// && ThreadData[i].Start == false) { ThreadData[i].work.Node = w; ThreadData[i].work.EvalOptimism = EvalOpt; ThreadData[i].work.CreditNps = credit; ThreadData[i].Start = true; // liberamos el thread SetEvent(ThreadData[i].IdleEvent); // esperamos a que se ponga en marcha while(ThreadData[i].Idle && ThreadData[i].Start) Sleep(); ThreadData[i].Start = false; return; } } // no hemos podido lanzarlo cedemos el paso a otro a ver si termina Sleep(); } #endif }