CJob *CJobManager::GetNextJob(const CJobWorker *worker) { CSingleLock lock(m_section); while (m_running) { // grab a job off the queue if we have one CJob *job = PopJob(); if (job) return job; // no jobs are left - sleep for 30 seconds to allow new jobs to come in lock.Leave(); bool newJob = m_jobEvent.WaitMSec(30000); lock.Enter(); if (!newJob) break; } // ensure no jobs have come in during the period after // timeout and before we held the lock CJob *job = PopJob(); if (job) return job; // have no jobs RemoveWorker(worker); return NULL; }
// // Removing manager indicated by index from the display. // Update managers with indexes greater than the one removed. // This function must be called before removing the manager from // the manager list. // void CWorkerView::RemoveManager(Manager * manager) { HTREEITEM hworker, hmanager; hmanager = GetManager(manager); // Remove the manager's workers and associated net clients. while (hworker = m_TWorkers.GetChildItem(hmanager)) { RemoveWorker((Worker *) m_TWorkers.GetItemData(hworker)); } // Remove the indicated manager from the display. m_TWorkers.DeleteItem(hmanager); m_TWorkers.RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_UPDATENOW | RDW_ERASE); theApp.pView->m_pPageNetwork->RemoveManager(manager); // Remove the indicated manager from memory. theApp.manager_list.RemoveManager(manager->GetIndex()); }
// // Removing the selected item from the GUI. // void CWorkerView::RemoveSelectedItem() { // Removing selected manager or worker. // First make sure that a manager or worker was selected. switch (selected_type) { case IOERROR: break; case ALL_MANAGERS: theApp.manager_list.RemoveAllManagers(); break; case MANAGER: RemoveManager(GetSelectedManager()); break; case WORKER: RemoveWorker(GetSelectedWorker()); break; } }
// // Remove worker from indicated manager. Update indexes for other // workers. This function must be called before removing the worker // from the list of workers. // void CWorkerView::RemoveWorker(Worker * worker) { // Get the worker tree item. HTREEITEM hworker = GetWorker(worker); // If removing a server with an active partner, remove partner as well. if (IsType(worker->Type(), GenericServerType) && worker->net_partner) { // Call RemoveWorker recursively to remove the NetClient from the GUI. RemoveWorker(worker->net_partner); } // Remove the indicated worker from memory. worker->manager->RemoveWorker(worker->GetIndex()); // Remove the indicated worker from the display. m_TWorkers.DeleteItem(hworker); m_TWorkers.RedrawWindow(); // Reset the results display tab to its initial state. theApp.pView->m_pPageDisplay->Reset(); }