Пример #1
0
MessageSent MessagesClient::sendMessageToSelf(
        const SendableMessage &message,
        const std::vector<unsigned char> &meta,
        const Protocol::ProgressHandler &onProgress)
{
    auto result = doSendMessage(nullptr, message, meta, onProgress);
    kulloAssert(result.messageSent);
    return *(result.messageSent);
}
Пример #2
0
Файл: vm.cpp Проект: 0x7CFE/llst
void SmalltalkVM::doSendMessage(TVMExecutionContext& ec)
{
    TObjectArray* messageArguments = ec.stackPop<TObjectArray>();

    // These do not need to be hptr'ed
    TSymbolArray& literals   = * ec.currentContext->method->literals;
    TSymbol* messageSelector = literals[ec.instruction.getArgument()];

    doSendMessage(ec, messageSelector, messageArguments);
}
Пример #3
0
std::size_t MessagesClient::sendMessage(
        const KulloAddress &recipient,
        const SendableMessage &message,
        const ProgressHandler &onProgress)
{
    auto result = doSendMessage(
                &recipient,
                message,
                std::vector<unsigned char>(),
                onProgress);
    return result.requestBodySize;
}
Пример #4
0
Файл: vm.cpp Проект: 0x7CFE/llst
void SmalltalkVM::doSendBinary(TVMExecutionContext& ec)
{
    // Loading the operand objects
    TObject* rightObject = ec.stackPop();
    TObject* leftObject  = ec.stackPop();

    // If operands are both small integers, we may handle it ourselves
    if (isSmallInteger(leftObject) && isSmallInteger(rightObject)) {
        // Loading actual operand values
        int32_t rightOperand = TInteger(rightObject);
        int32_t leftOperand  = TInteger(leftObject);
        bool unusedCondition;

        // Performing an operation
        switch ( static_cast<binaryBuiltIns::Operator>(ec.instruction.getArgument()) ) {
            case binaryBuiltIns::operatorLess:
                ec.returnedValue = (leftOperand < rightOperand) ? globals.trueObject : globals.falseObject;
                break;

            case binaryBuiltIns::operatorLessOrEq:
                ec.returnedValue = (leftOperand <= rightOperand) ? globals.trueObject : globals.falseObject;
                break;

            case binaryBuiltIns::operatorPlus:
                ec.returnedValue = callSmallIntPrimitive(primitive::smallIntAdd, leftOperand, rightOperand, unusedCondition);
                break;

            default:
                std::fprintf(stderr, "VM: Invalid opcode %d passed to sendBinary\n", ec.instruction.getArgument());
                std::exit(1);
        }

        ec.stackPush( ec.returnedValue );
        m_messagesSent++;
    } else {
        // This binary operator is performed on an ordinary object.
        // We do not know how to handle it, thus send the message to the receiver

        // Protecting pointers in case if GC occurs
        hptr<TObject> pRightObject = newPointer(rightObject);
        hptr<TObject> pLeftObject  = newPointer(leftObject);

        hptr<TObjectArray> messageArguments = newObject<TObjectArray>(2/*, false*/);
        messageArguments[1] = pRightObject;
        messageArguments[0] = pLeftObject;

        TSymbol* messageSelector = static_cast<TSymbol*>( globals.binaryMessages[ec.instruction.getArgument()] );
        doSendMessage(ec, messageSelector, messageArguments);
    }
}
Пример #5
0
void MinecraftDynmapProto::SendMsgWorker(void *p)
{
	if (p == NULL)
		return;

	ScopedLock s(send_message_lock_);

	std::string data = *(std::string*)p;
	delete (std::string*)p;

	data = utils::text::trim(data);

	if (isOnline() && data.length()) {
		doSendMessage(data);
	}
}
Пример #6
0
Файл: vm.cpp Проект: 0x7CFE/llst
SmalltalkVM::TExecuteResult SmalltalkVM::doSpecial(hptr<TProcess>& process, TVMExecutionContext& ec)
{
    TObjectArray& arguments  = * ec.currentContext->arguments;
    TSymbolArray& literals   = * ec.currentContext->method->literals;

    switch(ec.instruction.getArgument())
    {
        case special::selfReturn: {
            ec.returnedValue  = arguments[0]; // arguments[0] always keep self
            ec.currentContext = ec.currentContext->previousContext;

            if (ec.currentContext.rawptr() == globals.nilObject) {
                process->context = ec.currentContext;
                process->result  = ec.returnedValue;
                return returnReturned;
            }

            ec.loadPointers();
            ec.stackPush( ec.returnedValue );
        } break;

        case special::stackReturn: {
            ec.returnedValue  = ec.stackPop();
            ec.currentContext = ec.currentContext->previousContext;

            if (ec.currentContext.rawptr() == globals.nilObject) {
                process->context = ec.currentContext;
                process->result  = ec.returnedValue;
                return returnReturned;
            }

            ec.loadPointers();
            ec.stackPush( ec.returnedValue );
        } break;

        case special::blockReturn: {
            ec.returnedValue = ec.stackPop();
            TBlock* contextAsBlock = ec.currentContext.cast<TBlock>();
            ec.currentContext = contextAsBlock->creatingContext->previousContext;

            if (ec.currentContext.rawptr() == globals.nilObject) {
                process->context = ec.currentContext;
                process->result  = ec.returnedValue;
                return returnReturned;
            }

            ec.loadPointers();
            ec.stackPush( ec.returnedValue );
        } break;

        case special::duplicate: {
            // Duplicate an object on the stack
            TObject* copy = ec.stackLast();
            ec.stackPush(copy);
        } break;

        case special::popTop:
            ec.stackPop();
            break;

        case special::branch:
            ec.bytePointer = ec.instruction.getExtra();
            break;

        case special::branchIfTrue: {
            ec.returnedValue = ec.stackPop();

            if (ec.returnedValue == globals.trueObject)
                ec.bytePointer = ec.instruction.getExtra();
        } break;

        case special::branchIfFalse: {
            ec.returnedValue = ec.stackPop();

            if (ec.returnedValue == globals.falseObject)
                ec.bytePointer = ec.instruction.getExtra();
        } break;

        case special::sendToSuper: {
            uint32_t literalIndex    = ec.instruction.getExtra();
            TSymbol* messageSelector = literals[literalIndex];
            TClass*  receiverClass   = ec.currentContext->method->klass->parentClass;
            TObjectArray* messageArguments = ec.stackPop<TObjectArray>();

            doSendMessage(ec, messageSelector, messageArguments, receiverClass);
        } break;
    }

    return returnNoReturn;
}
Пример #7
0
Файл: vm.cpp Проект: 0x7CFE/llst
SmalltalkVM::TExecuteResult SmalltalkVM::execute(TProcess* p, uint32_t ticks)
{
    // Protecting the process pointer
    hptr<TProcess> currentProcess = newPointer(p);

    assert(currentProcess->context != 0);
    assert(currentProcess->context->method != 0);

    // Initializing an execution context
    TVMExecutionContext ec(m_memoryManager, this);
    ec.currentContext = currentProcess->context;
    ec.loadPointers(); // Loads bytePointer & stackTop

    while (true)
    {
        assert(ec.currentContext != 0);
        assert(ec.currentContext->method != 0);
        assert(ec.currentContext->stack != 0);
        assert(ec.bytePointer <= ec.currentContext->method->byteCodes->getSize());
        assert(ec.currentContext->arguments->getSize() >= 1);
        assert(ec.currentContext->arguments->getField(0) != 0);

        // Initializing helper references
        TByteObject&  byteCodes = * ec.currentContext->method->byteCodes;

        TObjectArray& temporaries       = * ec.currentContext->temporaries;
        TObjectArray& arguments         = * ec.currentContext->arguments;
        TObjectArray& instanceVariables = * arguments.getField<TObjectArray>(0);
        TSymbolArray& literals          = * ec.currentContext->method->literals;

        if (ticks && (--ticks == 0)) {
            // Time frame expired
            ec.storePointers();
            currentProcess->context = ec.currentContext;
            currentProcess->result  = ec.returnedValue;

            return returnTimeExpired;
        }

        // Decoding the instruction
        const uint16_t lastBytePointer = ec.bytePointer;
        ec.instruction = st::InstructionDecoder::decodeAndShiftPointer(byteCodes, ec.bytePointer);

        // And executing it
        switch (ec.instruction.getOpcode()) {
            case opcode::pushInstance:    ec.stackPush(instanceVariables[ec.instruction.getArgument()]); break;
            case opcode::pushArgument:    ec.stackPush(arguments[ec.instruction.getArgument()]);         break;
            case opcode::pushTemporary:   ec.stackPush(temporaries[ec.instruction.getArgument()]);       break;
            case opcode::pushLiteral:     ec.stackPush(literals[ec.instruction.getArgument()]);          break;
            case opcode::pushConstant:    doPushConstant(ec);                                  break;
            case opcode::pushBlock:       doPushBlock(ec);                                     break;

            case opcode::assignTemporary: temporaries[ec.instruction.getArgument()] = ec.stackLast();    break;
            case opcode::assignInstance: {
                TObject*  newValue   =   ec.stackLast();
                TObject** objectSlot = & instanceVariables[ec.instruction.getArgument()];

                // Checking whether we need to register current object slot in the GC
                checkRoot(newValue, objectSlot);

                // Performing the assignment
                *objectSlot = newValue;
            } break;

            case opcode::markArguments: doMarkArguments(ec); break;

            case opcode::sendMessage:   doSendMessage(ec);   break;
            case opcode::sendUnary:     doSendUnary(ec);     break;
            case opcode::sendBinary:    doSendBinary(ec);    break;

            case opcode::doPrimitive: {
                TExecuteResult result = doPrimitive(currentProcess, ec);
                if (result != returnNoReturn)
                    return result;
            } break;

            case opcode::doSpecial: {
                TExecuteResult result = doSpecial(currentProcess, ec);
                if (result != returnNoReturn)
                    return result;
            } break;

            default:
                std::fprintf(stderr, "VM: Invalid opcode %d at offset %d in method ", ec.instruction.getOpcode(), lastBytePointer);
                std::fprintf(stderr, "'%s'\n", ec.currentContext->method->name->toString().c_str() );
                std::exit(1);
        }
    }
}
Пример #8
0
SendMessageReply *MessageSession::sendMessage(const Message &message)
{
    return doSendMessage(message);
}
	void QtUdpSocketPlugin::sendMessage(const QString & message) {
		emit doSendMessage(message);
	}
	QtUdpSocketPlugin::QtUdpSocketPlugin() : _socket(nullptr), _helperReceiveCallback(), _checkerReceiveCallback(), _messageCounter(0), _conditionLock(), _conditionVariable(), _targetHost(), _targetPort(0) {
		QObject::connect(this, SIGNAL(doListen(quint16)), this, SLOT(onListen(quint16)));
		QObject::connect(this, SIGNAL(doConnect(QString, quint16)), this, SLOT(onConnect(QString, quint16)));
		QObject::connect(this, SIGNAL(doSendMessage(QString)), this, SLOT(onSendMessage(QString)));
		QObject::connect(this, SIGNAL(doDisconnect()), this, SLOT(onDisconnect()));
	}
Пример #11
0
void CWSAThread::doWSAEvent()
{
    SOCKET_KEY* pkey = NULL;

    while (m_bOperate)
    {
        //TODO check here, WSA_MAXIMUM_WAIT_EVENTS
        int nIndex = ::WSAWaitForMultipleEvents(m_nEventTotal, m_eventArray, FALSE, 10, FALSE);
        nIndex = nIndex - WSA_WAIT_EVENT_0;
        for (int i = nIndex; i < m_nEventTotal; ++i)
        {
            if (m_eventArray[i] == WSA_INVALID_EVENT)
            {
                continue;
            }

            int nret = ::WSAWaitForMultipleEvents(1, &m_eventArray[i], TRUE, 10, FALSE);

            if (nret == WSA_WAIT_FAILED || nret == WSA_WAIT_TIMEOUT)
            {
                if (nret == WSA_WAIT_FAILED)
                    LOG(_ERROR_, "CWSAThread::doWSAEvent() error, (nIndex == WSA_WAIT_FAILED)");
                continue;
            }
            else
            {
                WSANETWORKEVENTS event;
                if (::WSAEnumNetworkEvents(m_sockArray[i], m_eventArray[i], &event) == SOCKET_ERROR)
                {
                    LOG(_ERROR_, "CWSAThread::doWSAEvent() error, ::WSAEnumNetworkEvents() failed, error=%s", WSAGetLastError());
                    continue;
                }

                SOCKET_KEY* pkey = m_keymap[i];
                if (pkey == NULL)
                {
                    LOG(_ERROR_, "CWSAThread::doWSAEvent() error, pkey == NULL, SOCKET_KEY* pkey = m_keymap[%d]", i);
                    continue;
                }

                if (event.lNetworkEvents & FD_ACCEPT)
                {
                    LOG(_INFO_, "CWSAThread::doWSAEvent(), FD_ACCEPT, m_listenfd=%d, m_sockArray[i]=%d", m_listenfd, m_sockArray[i]);
                    if (event.iErrorCode[FD_ACCEPT_BIT] == 0)
                    {
                        if (m_nEventTotal > WSA_MAXIMUM_WAIT_EVENTS)
                        {
                            LOG(_INFO_, "CWSAThread::doWSAEvent() error, m_nEventTotal > WSA_MAXIMUM_WAIT_EVENTS");
                            continue;
                        }

                        if (m_listenfd == m_sockArray[i] && m_listenfd == pkey->fd)
                        {
                            if (!doAccept(m_listenfd))
                            {
                                LOG(_ERROR_, "CWSAThread::doWSAEvent() error, m_listenfd=%d", m_listenfd);
                            }
                        }
                    }
                }
                else if (event.lNetworkEvents & FD_READ)
                {
                    LOG(_INFO_, "CWSAThread::doWSAEvent(), FD_READ, m_listenfd=%d, m_sockArray[i]=%d", m_listenfd, m_sockArray[i]);
                    if (event.iErrorCode[FD_ACCEPT_BIT] == 0)
                    {
                        if (m_nEventTotal > WSA_MAXIMUM_WAIT_EVENTS)
                        {
                            LOG(_INFO_, "CWSAThread::doWSAEvent() error, m_nEventTotal > WSA_MAXIMUM_WAIT_EVENTS");
                            continue;
                        }
                        if (m_listenfd == m_sockArray[i] && m_listenfd == pkey->fd)
                        {
                            if (!doAccept(m_listenfd))
                            {
                                LOG(_ERROR_, "CWSAThread::doWSAEvent() error, m_listenfd=%d", m_listenfd);
                            }
                            continue;
                        }
                        doRecvMessage(pkey);
                    }
                }
                else if (event.lNetworkEvents & FD_WRITE)
                {
                    LOG(_INFO_, "CWSAThread::doWSAEvent(), FD_WRITE, m_listenfd=%d, m_sockArray[i]=%d", m_listenfd, m_sockArray[i]);
                    if (doSendMessage(pkey) < 0)
                    {
                        closeClient(pkey->fd, pkey->connect_time);
                    }
                    else
                    {
                        //TODO reset socket event here ?
                    }
                }
                else
                {
                    LOG(_INFO_, "CWSAThread::doWSAEvent(), FD_XXX, m_listenfd=%d, m_sockArray[i]=%d", m_listenfd, m_sockArray[i]);
                    closeClient(pkey->fd, pkey->connect_time);
                }
            }
        }//end for
        //// end handle WSAWaitForMultipleEvents /////

        /////////////////begin copy all recv message to recv list/////////////////
        if (m_recvtmplst.size() > 0)
        {
            CSysQueue<NET_DATA>* precvlist = CGlobalMgr::getInstance()->getRecvQueue();
            precvlist->Lock();
            list<NET_DATA*>::iterator iter = m_recvtmplst.begin();
            for (; iter != m_recvtmplst.end(); ++iter)
            {
                if ( (*iter) == NULL)
                    continue;
                if (!precvlist->inQueueWithoutLock(*iter, false))
                {
                    LOG(_ERROR_, "CWSAThread::doEpollEvent() error, inQueueWithoutLock() failed");
                    delete (*iter);
                }
            }
            precvlist->UnLock();
            m_recvtmplst.clear();
        }
        /////////////////end copy all recv message to recv list/////////////////

        //////////////////begin handle system events////////////////////////////
        doSystemEvent();
        //////////////////end handle system events//////////////////////////////////

        //////////////////begin set write wsa event by sendset////////////////
        CGlobalMgr::getInstance()->switchSendMap();
        map<int, list<NET_DATA*>*>* psendmap = CGlobalMgr::getInstance()->getBakSendMap();

        for (map<int, list<NET_DATA*>*>::iterator itersendmap = psendmap->begin(); itersendmap != psendmap->end(); ++itersendmap)
        {
            map<int, SOCKET_SET*>::iterator itersockmap = m_socketmap.find(itersendmap->first);
            if (itersockmap == m_socketmap.end() || itersockmap->second == NULL || itersockmap->second->key == NULL)
            {
                LOG(_ERROR_, "CEpollThread::doEpollEvent() error, m_socketmap.find(fd) failed");
                m_delsendfdlist.push_back(itersendmap->first);
                continue;
            }

            int i = 0;
            for (; i < WSA_MAXIMUM_WAIT_EVENTS; ++i)
            {
                if (itersendmap->first == m_sockArray[i])
                    break;
            }
            if (i > WSA_MAXIMUM_WAIT_EVENTS)
            {
                LOG(_ERROR_, "CEpollThread::doEpollEvent() error, m_sockArray[i] can't find(fd) failed");
                m_delsendfdlist.push_back(itersendmap->first);
                continue;
            }
            if (::WSAEventSelect(m_sockArray[i], m_eventArray[i], FD_WRITE) == SOCKET_ERROR)
            {
                LOG(_ERROR_, "CWSAThread::doEpollEvent() error, WSAEventSelect() failed, listen fd=%d, error=%ld", m_listenfd, WSAGetLastError());
                break;
            }
        }

        for (list<int>::iterator iterdelsendfdlist = m_delsendfdlist.begin(); iterdelsendfdlist != m_delsendfdlist.end(); ++iterdelsendfdlist)
        {
            deleteSendMsgFromSendMap(*iterdelsendfdlist);
        }
        m_delsendfdlist.clear();

        doKeepaliveTimeout();

        doSendKeepaliveToServer();
    }//end while
}