void Session::handleConnect(const boost::system::error_code &error, boost::asio::ip::tcp::resolver::iterator endpointIterator) { if (!error) { boost::asio::ip::tcp::endpoint endpoint = *endpointIterator; LogManager::getSingletonPtr()->logManager("Connected to " + endpoint.address() + ":" + endpoint.port()); setState(EXCHANGE_KEY); HandshakeMessage handshakeMessage(id, username, endpoint.address().to_string(), endpoint.port()); sendImmediate(handshakeMessage); } else if (++endpointIterator != boost::asio::ip::tcp::resolver::iterator()) { LogManager::getSingletonPtr()->logManager("Connection failed -- retrying"); socket.close(); boost::asio::ip::tcp::endpoint endpoint = *endpointIterator; socket.async_connect(endpoint, boost::bind(&Session::handleConnect, this, boost::asio::placeholders::error, endpointIterator)); } else { LogManager::getSingletonPtr()->logManager("Connection failed: " + error.message()); disconnect(); } }
void immediatering_init(void) { int setNum = 0; if (CkMyRank()==0 && numTests==0) setNum = 1; #if 1 // test Charm immediate messages if (setNum) numTests +=2; immring_nodegrp[0].start(new immMessage); immring_grp[0].start(new immMessage); #endif #if 1 if (setNum) numTests ++; sendImmediate(0,0); #endif }
// Converse immediate handler void immediatering_startHandler(void *vmsg) { const int maxRings = 1000; immediateMsg *msg=(immediateMsg *)vmsg; if(0!=strcmp(msg->data,"Array!")) { CkAbort("Message corrupted"); } if(CkMyNode()==0) msg->iter++; if (msg->iter < maxRings) { /* Keep passing message around the ring */ /* This is questionable: */ sendImmediate((CkMyNode()+1) % CkNumNodes(),msg->iter); } else /* msg->iter>=maxRings, so stop: */ { /* megatest_finish isn't safe from an immediate, so send a regular non-immediate message out: */ int size=CmiMsgHeaderSizeBytes; void *msg=CmiAlloc(size); CmiSetHandler(msg,immediatering_finishHandlerIdx); CmiSyncSendAndFree(0,size,(char *)msg); } CmiFree(msg); }