void BoundingTask::SendFatalError(Exception& e) { // if the front-end has been told about this exception already, we don't tell it again if (e.frontendnotified(true)) return; POVMS_Message msg(kPOVObjectClass_ControlData, kPOVMsgClass_SceneOutput, kPOVMsgIdent_Error); msg.SetString(kPOVAttrib_EnglishText, e.what()); msg.SetInt(kPOVAttrib_Error, 0); msg.SetInt(kPOVAttrib_SceneId, sceneData->sceneId); msg.SetSourceAddress(sceneData->backendAddress); msg.SetDestinationAddress(sceneData->frontendAddress); POVMS_SendMessage(msg); }
bool TaskQueue::Process() { boost::recursive_mutex::scoped_lock lock(queueMutex); for(list<TaskEntry>::iterator i(activeTasks.begin()); i != activeTasks.end();) { if(failed == kNoError) failed = i->GetTask()->FailureCode(); if(i->GetTask()->IsDone() == true) { list<TaskEntry>::iterator e(i); i++; activeTasks.erase(e); } else i++; } if(failed != kNoError) { Stop(); return false; } if(queuedTasks.empty() == false) { switch(queuedTasks.front().GetEntryType()) { case TaskEntry::kTask: { activeTasks.push_back(queuedTasks.front()); queuedTasks.front().GetTask()->Start(boost::bind(&TaskQueue::Notify, this)); queuedTasks.pop(); break; } case TaskEntry::kSync: { if(activeTasks.empty() == true) queuedTasks.pop(); else return false; break; } case TaskEntry::kMessage: { try { POVMS_SendMessage(queuedTasks.front().GetMessage()); } catch(pov_base::Exception&) { } queuedTasks.pop(); break; } case TaskEntry::kFunction: { try { queuedTasks.front().GetFunction()(*this); } catch(pov_base::Exception&) { } queuedTasks.pop(); break; } } } if(queuedTasks.empty() == true) processCondition.wait(lock); return (queuedTasks.empty() == false); }