Ejemplo n.º 1
0
// caller should delete BufferReceiver.
BufferReceiver* Message::receiveBuffer(uintptr_t tid)
{
    BufferReceiver* receiver;
    for (;;) {
        MessageInfo expectedMsg;
        expectedMsg.from = tid;
        MessageInfo msg;
        if (Message::receive(&msg, &expectedMsg, isSendBufferPacket) != M_OK) {
            continue;
        }

        if (msg.header == Message::MSG_SEND_BUFFER_START) {
            uintptr_t bufferSize = msg.arg1;
            receiver = new BufferReceiver(bufferSize);
            receiver->receive(msg.str, MESSAGE_INFO_MAX_STR_LENGTH);
        } else if (msg.header == Message::MSG_SEND_BUFFER_PACKET) {
            ASSERT(receiver != NULL);
            receiver->receive(msg.str, MESSAGE_INFO_MAX_STR_LENGTH);
        }
        if (receiver->isDone()) {
            return receiver;
        }
    }
}