bool writesOverlap(Graph& graph, Node* node, ClobberSet& writeSet) { NoOpClobberize addRead; ClobberSetOverlaps addWrite(writeSet); clobberize(graph, node, addRead, addWrite); return addWrite.result(); }
void dmtcp::ConnectionRewirer::registerIncoming ( const ConnectionIdentifier& local , const dmtcp::vector<int>& fds ) { _pendingIncoming[local] = fds; JTRACE ( "announcing pending incoming" ) ( local ); DmtcpMessage msg; msg.type = DMT_RESTORE_WAITING; msg.restorePid = local; JASSERT ( _coordinatorFd > 0 ); addWrite ( new jalib::JChunkWriter ( _coordinatorFd , ( char* ) &msg, sizeof ( DmtcpMessage ) ) ); }
void SocketMonitor::processReadSet( Strategy& strategy, fd_set& readSet ) { #ifdef _MSC_VER for ( unsigned i = 0; i < readSet.fd_count; ++i ) { int s = readSet.fd_array[ i ]; if( s == m_interrupt ) { int socket = 0; recv( s, (char*)&socket, sizeof(socket), 0 ); addWrite( socket ); } else { strategy.onEvent( *this, s ); } } #else Sockets::iterator i; Sockets sockets = m_readSockets; for ( i = sockets.begin(); i != sockets.end(); ++i ) { int s = *i; if ( !FD_ISSET( *i, &readSet ) ) continue; if( s == m_interrupt ) { int socket = 0; recv( s, (char*)&socket, sizeof(socket), 0 ); addWrite( socket ); } else { strategy.onEvent( *this, s ); } } #endif }
void addReadsAndWrites(Graph& graph, Node* node, ClobberSet& readSet, ClobberSet& writeSet) { ClobberSetAdd addRead(readSet); ClobberSetAdd addWrite(writeSet); clobberize(graph, node, addRead, addWrite); }
void addWrites(Graph& graph, Node* node, ClobberSet& writeSet) { NoOpClobberize addRead; ClobberSetAdd addWrite(writeSet); clobberize(graph, node, addRead, addWrite); }
void dmtcp::ConnectionRewirer::onData ( jalib::JReaderInterface* sock ) { JASSERT ( sock->bytesRead() == sizeof ( DmtcpMessage ) ) ( sock->bytesRead() ) ( sizeof ( DmtcpMessage ) ); DmtcpMessage& msg = * ( DmtcpMessage* ) sock->buffer(); msg.assertValid(); if ( msg.type == DMT_FORCE_RESTART ) { JTRACE ( "got DMT_FORCE_RESTART, exiting ConnectionRewirer" ) ( _pendingOutgoing.size() ) ( _pendingIncoming.size() ); _pendingIncoming.clear(); _pendingOutgoing.clear(); finishup(); return; } JASSERT ( msg.type==DMT_RESTORE_WAITING ) ( msg.type ).Text ( "unexpected message" ); // Find returns iterator 'i' w/ 0 or more elts, with first elt matching key. iterator i = _pendingOutgoing.find ( msg.restorePid ); if ( i == _pendingOutgoing.end() ) { // 'i' is an iterator over 0 elements. JTRACE ( "got RESTORE_WAITING MESSAGE [not used]" ) ( msg.restorePid ) ( _pendingOutgoing.size() ) ( _pendingIncoming.size() ); } else { // 'i' is an iterator over 1 element. JTRACE ( "got RESTORE_WAITING MESSAGE, reconnecting..." ) ( msg.restorePid ) ( msg.restorePort ) ( msg.restoreAddrlen ) ( _pendingOutgoing.size() ) ( _pendingIncoming.size() ); const dmtcp::vector<int>& fds = i->second; JASSERT ( fds.size() > 0 ); int fd0 = fds[0]; jalib::JSocket remote = jalib::JSocket::Create(); remote.changeFd ( fd0 ); errno = 0; JASSERT ( remote.connect ( ( sockaddr* ) &msg.restoreAddr,msg.restoreAddrlen,msg.restorePort ) ) ( msg.restorePid ) ( msg.restorePort ) ( JASSERT_ERRNO ) .Text ( "failed to restore connection" ); { DmtcpMessage peerMsg; peerMsg.type = DMT_RESTORE_RECONNECTED; peerMsg.restorePid = msg.restorePid; addWrite ( new jalib::JChunkWriter ( remote, ( char* ) &peerMsg,sizeof ( peerMsg ) ) ); } for ( size_t n = 1; n<fds.size(); ++n ) { JTRACE ( "restoring extra fd" ) ( fd0 ) ( fds[n] ); JASSERT ( _real_dup2 ( fd0,fds[n] ) == fds[n] ) ( fd0 ) ( fds[n] ) ( msg.restorePid ) .Text ( "dup2() failed" ); } _pendingOutgoing.erase ( i ); } if ( pendingCount() ==0 ) finishup(); #ifdef DEBUG else debugPrint(); #endif }