Скачать 0.71 Mb.
|
int nodeIndex; int totalNodes = nodeList.entries(); if(totalNodes == 1) { log->endEvent("Have only one node in list"); return 0; } nodeIndex = nodeList.index(nodeNum); assert(nodeIndex != -1); if((nodeIndex + 1) < totalNodes) { log->endEvent(toString(nodeList.find(nodeIndex + 1))); return nodeList.find(nodeIndex + 1); } else { log->endEvent(toString(nodeList.find(0))); return nodeList.find(0); } } int ProcWatch::sendMessageToNextNode(message_struct * message) { log->startEvent("ProcWatch::sendMessageToNextNode"); int sendStatus = -1; int receiverNode = getnid(); do { answerToAllMessages(); receiverNode = nextNode(receiverNode); if((receiverNode == getnid()) || (receiverNode == 0)) { log->endEvent("Cant selfsend message"); return MESSAGE_CANT_SEND; } pid_t receiver = qnx_name_locate(0, nodeNamePrefix + toString(receiverNode), sizeof(message_struct), NULL); if(receiver != -1) { sendStatus = Send(receiver, message, message, messageSize(message->type), sizeof(message_struct)); qnx_vc_detach(receiver); //node who send message now unavailible if((sendStatus != 0) && (receiverNode == message->sender)) { log->endEvent("message cant send to sender"); return MESSAGE_CANT_SEND; } } else if(receiverNode == message->sender) { log->endEvent("message cant send to sender"); return MESSAGE_CANT_SEND; } } while(sendStatus != 0); delay(MESSAGE_TIMEOUT); log->endEvent("message send"); return MESSAGE_SEND; } int ProcWatch::registerMyNodeName() { return qnx_name_attach(0, nodeNamePrefix + toString(getnid())); } void ProcWatch::registerMyNodeAsMainNode() { mainNodeNameId = qnx_name_attach(0, nodeNamePrefix + "main"); } void ProcWatch::unregisterMyNodeAsMainNode() { qnx_name_detach(0, mainNodeNameId); } pid_t ProcWatch::getMessage(message_struct *message) { pid_t sender; sender = Creceive(0, message, sizeof(message_struct)); if(sender == -1) { return NO_NEW_MESSAGES; } return sender; } int ProcWatch::sendReplyMessage(message_struct *message, pid_t sender) { int replyState = Reply(sender, message, sizeof(message_struct)); return replyState; } void ProcWatch::answerToAllMessages() { message_struct newMsg; message_struct incomingMsg; pid_t sender; while((sender = getMessage(&incomingMsg)) != NO_NEW_MESSAGES) { clusterState->cycleOfLastMessage = clusterState->cycle; log->startEvent("HAVE_NEW_MSG"); int sendNextNode = answerMessage(&incomingMsg, &newMsg); sendReplyMessage(&incomingMsg, sender); log->endEvent("MSG_PROCESSED"); if(sendNextNode == SEND_MESSAGE_TO_NEXT_NODE) { sendMessageToNextNode(&newMsg); } } } LRNode::LRNode(int lNode, int nodeWidth) { logicalNode = lNode; realNode = 0; logicalNodeWidth = nodeWidth; } LRNode::operator==(const LRNode &node) const { return(logicalNode == node.logicalNode); } RealNodeInfo::RealNodeInfo(nid_t rNode, int nodeStatus) { node = rNode; status = nodeStatus; } RealNodeInfo::operator==(const RealNodeInfo &rNode) const { return(node == rNode.node); } NodesInfo::NodesInfo(WCPtrSList { cout << "debug: NodesInfo::NodesInfo" << endl; int nodeNum = nodes.entries(); int nodeCount = 0; while(nodeCount < nodeNum) { RealNodeInfo * node = nodes.find(nodeCount); RealNodeInfo * rNode; RealNodeInfo * rNodeStartState; if(node->node == getnid()) { rNode = new RealNodeInfo(node->node, NS_PASSIVE); rNodeStartState = new RealNodeInfo(node->node, NS_PASSIVE); } else { rNode = new RealNodeInfo(node->node, NS_UNAVAILIBLE); rNodeStartState = new RealNodeInfo(node->node, NS_UNAVAILIBLE); } rNodes.append(rNode); rNodesStartState.append(rNodeStartState); ++nodeCount; } } void NodesInfo::reset() { cout << "debug: NodesInfo::reset" << endl; int nodesTotal = rNodes.entries(); int nodesCounter = 0; rNodes.clearAndDestroy(); while(nodesCounter < nodesTotal) { RealNodeInfo * rNodeSS = rNodesStartState.find(nodesCounter); RealNodeInfo * rNode = new RealNodeInfo(rNodeSS->node, rNodeSS->status); rNodes.append(rNode); ++nodesCounter; } } void NodesInfo::setRealNodeToLogicalNode(int lNode, int rNode) { LRNode node(lNode, 0); int nodeIndex = lrNodes.index(&node); assert(nodeIndex != -1); LRNode * currentNode = lrNodes.find(nodeIndex); currentNode->realNode = rNode; } int NodesInfo::getRealNodeFromLogicalNode(int lNode) { LRNode node(lNode, 0); int nodeIndex = lrNodes.index(&node); assert(nodeIndex != -1); return lrNodes.find(nodeIndex)->realNode; } int NodesInfo::realNodeState(int node) { RealNodeInfo rNode(node, 0); int nodeIndex = rNodes.index(&rNode); cout << "debug: realNodeState :node " << node; if(rNodes.find(nodeIndex)->status == NS_ACTIVE) cout << " NS_ACTIVE" << endl; else if(rNodes.find(nodeIndex)->status == NS_PASSIVE) cout << " NS_PASSIVE" << endl; else cout << " NS_UNKNOWN" << endl; assert(nodeIndex != -1); return rNodes.find(nodeIndex)->status; } int NodesInfo::isRealNodeAvailible(int rNode) { RealNodeInfo realNode(rNode, NS_PASSIVE); int nodeIndex; if((nodeIndex = rNodes.index(&realNode)) == -1) { return 0; } else { if(rNodes.find(nodeIndex)->status == NS_UNAVAILIBLE) { return 0; } return 1; } } int NodesInfo::haveActiveNode() { int nodeCount = 0; int totalNodes = rNodes.entries(); while(nodeCount < totalNodes) { RealNodeInfo * realNode = rNodes.find(nodeCount); if(realNode->status == NS_ACTIVE) { return 1; } ++nodeCount; } return 0; } int NodesInfo::findMinWidthRealNode() { int minNodeNum = getnid(); int minNodeWidth = -1; int nodeCount = 0; int totalNodes = rNodes.entries(); while(nodeCount < totalNodes) { RealNodeInfo * realNode = rNodes.find(nodeCount); if(realNode->status != NS_UNAVAILIBLE) { int nodeNum = realNode->node; int nodeWidth = getWidthOnNode(nodeNum); if((minNodeWidth == -1) || (nodeWidth < minNodeWidth)) { minNodeNum = nodeNum; minNodeWidth = nodeWidth; } } ++nodeCount; } return minNodeNum; } RealNodeInfo * NodesInfo::getNode(int node) { cout << "debug: NodesInfo::getNode(" << node << ")" << endl; RealNodeInfo realNode(node, NS_PASSIVE); int nodeIndex = rNodes.index(&realNode); assert(nodeIndex != -1); return rNodes.find(nodeIndex); } ClusterState::ClusterState() { currentRev = 0; newRev = 0; remainingUpdates = 0; cycle = 0; cycleOfLastMessage = MESSAGE_NEVER_GET; } int main() { Config conf("/home/dmitry/test/main.txt"); int status = conf.checkConfig(); log = new LogEvents(); log->startEvent("PARSE-CONFIG :file /home/dmitry/test/main.txt"); if(status != PARSE_ERROR) { log->endEvent("OK"); ProcWatch watcher(conf.getNodeList(), conf.getProcList()); watcher.startMonitoring(); } else { log->endEvent("ERROR"); } return 0; } |
Охватывают различные подразделения, начиная с приема больного в стационаре и заканчивая его выпиской. В медицинских учреждениях работает... | Охватывает вопросы конструирования, исследования и принципов применения интегральных микросхем | ||
Разработка кода программного продукта на основе готовых спецификаций на уровне модуля 10 | Торговая компания, специализирующаяся в области оптовых продаж импортных и отечественных строительных материалов, средне-высокой... | ||
«Разработка специального программного обеспечения для модернизации аппаратно–программного комплекса «Сапфир» | Логико-структурная матрица по дипломному проекту «Внедрение эффективного контракта» (пример заполнения) | ||
Данные гис – данные, полученные в результате геофизического исследования скважин. Синоним к термину «Каротажные данные» | Методическая разработка предназначена для обучающихся специальности 38. 02. 01 | ||
Целью освоения модуля является формирование у студентов V курса стоматологического факультета, профессиональных компетенций по способности... | Методическая разработка на тему: «Тестовый контроль в методах и средствах личностно ориентированного обучения». Подготовила Фалько... |
Поиск Главная страница   Заполнение бланков   Бланки   Договоры   Документы    |