示例#1
0
void childProcess( Process* proc ) {

	closeUnusedPipes( proc );

	// STARTED
	proc -> started += 1;
	incLamportTime();
	Message startedMsg;
	fillMessage( &startedMsg, proc, STARTED );
	makeIPCLog( startedMsg.s_payload );
	send_multicast( proc, &startedMsg );


	// Receive STARTED
	while( proc -> started != proc -> total ) {
		defaultCSExtendedCycle( proc );
	}
	sprintf( LogBuf, log_received_all_started_fmt, get_lamport_time(), proc -> localId );
	makeIPCLog( LogBuf );


	// Payload
	int totalIterations = proc -> localId * 5;
	for( int i = 1; i <= totalIterations; i ++ ) {
		sprintf( LogBuf, log_loop_operation_fmt, proc -> localId, i, totalIterations );

		if( proc -> isMutex ) request_cs( proc );

		print( LogBuf );

		if( proc -> isMutex ) release_cs( proc );
	}


	// DONE
	proc -> done += 1;
	incLamportTime();
	Message doneMsg;
	fillMessage( &doneMsg, proc, DONE );
	makeIPCLog( doneMsg.s_payload );
	send_multicast( proc, &doneMsg );


	// Receive DONE
	while( proc -> done != proc -> total ) {
		defaultCSExtendedCycle( proc );
	}
	sprintf( LogBuf, log_received_all_done_fmt, get_lamport_time(), proc -> localId );
	makeIPCLog( LogBuf );

	closeTheOtherPipes( proc );
}
/* Creates and sends message.*/
void twitClient::createAndSendMessage(char command[],const std::string& other)
{
    char* msg = new char[PACKAGE_SIZE];
    resetMessage(msg);
    fillMessage(msg,command,other);
    sendMessage(msg);
    delete[] (msg);
}
示例#3
0
int release_cs( const void* self ) {
	const Process* proc = self;

	pop( proc -> list );

	// CS_RELEASE
	incLamportTime();
	Message releaseMsg;
	fillMessage( &releaseMsg, proc, CS_RELEASE );
	send_multicast( ( void* ) proc, &releaseMsg );

	return 0;
}
示例#4
0
int request_cs( const void* self ) {
	Process* proc = ( Process* ) self;

	// CS_REQUEST
	incLamportTime();
	Message requestMsg;
	fillMessage( &requestMsg, proc, CS_REQUEST );
	send_multicast( ( void* ) proc, &requestMsg );

	Request request = { get_lamport_time(), proc -> localId };
	insert( proc -> list, request );

	proc -> replied = 1;
	while( proc -> replied != proc -> total || !isFirst( proc -> list, proc -> localId ) ) {
		defaultCSExtendedCycle( proc );
	}

	return 0;
}
示例#5
0
void SinaParserXml::parserDM(QDomElement &messageElement, Status &status)
{
    QDomNodeList messageNodes = messageElement.childNodes();
    for( uint j=0; j<messageNodes.length(); j++)
    {
        QDomNode node = messageNodes.at(j);
        QDomElement element = node.toElement();
        if(element.tagName()=="sender")
        {
            QDomNodeList senderNodes = element.childNodes();
            for( uint i=0; i<senderNodes.length(); i++)
            {
                QDomElement senderElement = senderNodes.at(i).toElement();
                fillSender(status, senderElement.tagName(), senderElement.text());
            }

        }
        else
            fillMessage(status, element.tagName(), element.text());
    }
}
示例#6
0
void defaultCSExtendedCycle( Process* proc ) {

	Message msg;
	receive_any( proc, &msg );

	setMaxLamportTime( msg.s_header.s_local_time );
	incLamportTime();

	switch( msg.s_header.s_type ) {
		case STARTED: {
			proc -> started += 1;
			break;
		}
		case CS_REQUEST: {

			Request request = { msg.s_header.s_local_time, proc -> msgAuthor };
			insert( proc -> list, request );

			// CS_REPLY
			incLamportTime();
			Message replyMsg;
			fillMessage( &replyMsg, proc, CS_REPLY );
			send( ( void* ) proc, proc -> msgAuthor, &replyMsg );

			break;
		}
		case CS_REPLY: {
			proc -> replied += 1;
			break;
		}
		case CS_RELEASE: {
			pop( proc -> list );
			break;
		}
		case DONE: {
			proc -> done += 1;
			break;
		}
	}
}
示例#7
0
		Exception::Exception(const std::string& iFile, int iLine, std::ostringstream& iStreamMessage) throw ()
				:std::exception(),_message(),_file(iFile), _line(0) {
			fillMessage(iFile, iLine, iStreamMessage);
		}
示例#8
0
        Exception::Exception(const std::string& iFile, int iLine, const std::string& iMessage) throw ()
			:std::exception(),_message(),_file(iFile), _line(0) {
            std::ostringstream aStream;
			aStream << iMessage;
			fillMessage(iFile, iLine, aStream);
        }
示例#9
0
void GameConnect::handle(portals::OutPortal<messages::GameState>& out,
                         portals::InPortal<messages::GCResponse>& in,
                         int player)
{
    char packet[sizeof(struct RoboCupGameControlData)];
    int result;
    struct sockaddr from;
    int addrlen = sizeof(from);
    struct RoboCupGameControlData control;
    do
    {
        portals::Message<messages::GameState> gameMessage(0);
        memset(&packet[0], 0, sizeof(struct RoboCupGameControlData));

        result = _socket->receiveFrom(&packet[0], sizeof(packet),
                                      &from, &addrlen);

        if (_timer->timestamp() - _gcTimestamp > TEAMMATE_DEAD_THRESHOLD) {
            _haveRemoteGC = false;

            fillMessage(gameMessage.get(), control);
            out.setMessage(gameMessage);
        }

        if (result <= 0)
            break;

        if (!verify(&packet[0]))
            continue;  // Bad Packet.

        _haveRemoteGC = true;
        _gcTimestamp = _timer->timestamp();

        memcpy(&control, &packet[0], sizeof(RoboCupGameControlData));
        fillMessage(gameMessage.get(), control);

#ifdef DEBUG_COMM
        std::cout << "Received Game Controller message:\n\n"
                  << gameMessage.get()->DebugString()
                  << std::endl;
#endif

        out.setMessage(gameMessage);

        // Reset the target to the GC that we are getting data from.
        char destination[INET_ADDRSTRLEN];

        inet_ntop(AF_INET, &((struct sockaddr_in*)&from)->sin_addr,
                  &destination[0], INET_ADDRSTRLEN);
        _socket->setTarget(&destination[0], GAMECONTROLLER_PORT);
        _socket->setBroadcast(false);

        in.latch();

        if (player)
            respond(player, in.message().status());
        else
        {
            //@TODO: Currently can't respond with correct status,
            //need InPortals for other players... Too much overhead?
            // for (int i = 1; i <= NUM_PLAYERS_PER_TEAM; ++i)
            //     respond(i);
        }
    } while (true);
}