Esempio n. 1
0
void
AsyncChannel::ProcessLink::OnEchoMessage(Message* msg)
{
    AssertIOThread();
    OnMessageReceived(*msg);
    delete msg;
}
Esempio n. 2
0
void
ProcessLink::OnEchoMessage(Message* msg)
{
    AssertIOThread();
    OnMessageReceived(Move(*msg));
    delete msg;
}
Esempio n. 3
0
  void User::HandleServerInfoGameMessage (yap::IPacket& packet)
  {
    yap::String senderName = packet.ReadString ();
    yap::String content = packet.ReadString ();

    yap::GameMessage gameMessage;
    gameMessage.SetSenderName (senderName);
    gameMessage.SetContent (content);

    OnMessageReceived (*this, gameMessage);
  }
Esempio n. 4
0
/* ------------------------------------------------------------------------- */
static int OnRxBody(TServant *const servant)
{
    TRxControl *const ctrl = &servant->m_rx;

    if (GetRxData(servant->m_session.m_connection, ctrl))
        return -EXIT_FAILURE;

    if (ctrl->m_n_to_receive)
        return -EXIT_SUCCESS; /* continue receiving */


    /* body is received */

    {
        ezxml_t xml;
        const char* body;
        size_t len;

        body = GetBody(ctrl, &len);
        assert(len > 0 && body);

        xml = ezxml_parse_str_d(body, len);
        if (!xml)
        {
            LOG1_ERROR("servant", "the session (%u) received an invalid "
                "formated message", servant->m_session.m_id);
            return -EXIT_FAILURE;
        }

        if (OnMessageReceived(servant, xml))
            return -EXIT_FAILURE;
    }

    StartRx(servant);
    return -EXIT_SUCCESS;
}
Esempio n. 5
0
void
ProcessLink::OnTakeConnectedChannel()
{
    AssertIOThread();

    queue<Message> pending;
    {
        MonitorAutoLock lock(*mChan->mMonitor);

        mChan->mChannelState = ChannelConnected;

        mExistingListener = mTransport->set_listener(this);
        if (mExistingListener) {
            mExistingListener->GetQueuedMessages(pending);
        }
        lock.Notify();
    }

    // Dispatch whatever messages the previous listener had queued up.
    while (!pending.empty()) {
        OnMessageReceived(Move(pending.front()));
        pending.pop();
    }
}
Esempio n. 6
0
void IOLoop::Run()
{
  while (m_shouldRun)
  {
    //remove channels
    if (m_removeChannels.GetLength() > 0)
    {
      m_channelsMutex.Lock();
      m_removeChannelsMutex.Lock();
      for (int i = 0; i < m_removeChannels.GetLength(); i++)
      {
        m_channels.Remove(m_removeChannels[i]);
        delete m_removeChannels[i];
      }
      m_removeChannels.Reset();
      m_removeChannelsMutex.Unlock();
      m_channelsMutex.Unlock();
    }

    //get channel events
    int numChannels = m_channels.GetLength();
    int numProcesses = m_processes.GetLength();
    int numEvents = numChannels + numProcesses;
    if (numEvents < 1)
    {
      Sleep(10);
      continue;
    }
    else if (numEvents > MAXIMUM_WAIT_OBJECTS)
    {
      VASSERT("Too many Events" == NULL);
      continue;
    }

    HANDLE eventHandles[MAXIMUM_WAIT_OBJECTS];

    m_channelsMutex.Lock();
    for (int i = 0; i < numChannels; i++)
    {
      eventHandles[i] = m_channels[i]->GetPendingMessagesEvent();
    }
    m_channelsMutex.Unlock();
    m_processesMutex.Lock();
    for (int i = 0; i < numProcesses; i++)
    {
      eventHandles[numChannels + i] = m_processes[i];
    }
    m_processesMutex.Unlock();

    DWORD waitRes = WaitForMultipleObjects(numEvents, eventHandles, FALSE, 200);
    if (waitRes == WAIT_FAILED)
    {
      DWORD lastError = GetLastError();
      std::cout << "WaitForMultipleObjects failed with error code: " << lastError << std::endl;
      continue;
    }

    if (waitRes == WAIT_TIMEOUT)
      continue;
    
    int eventIndex = waitRes - WAIT_OBJECT_0;
    if (eventIndex >= 0 && eventIndex < numChannels) 
    {
      m_channels[eventIndex]->ProcessMessages();
      if (!m_channels[eventIndex]->IsValid())
      {
        MsgChannelClosed msg(eventIndex);
        msg.SetReceiverId(m_id);
        msg.SetSenderId(1);
        OnMessageReceived(msg);
      }
    }
    else if (eventIndex < numEvents)
    {
      HANDLE processHandle = m_processes[eventIndex - numChannels];

      MsgPeerIsDead msg(processHandle);
      msg.SetReceiverId(m_id);
      msg.SetSenderId(1);
      OnMessageReceived(msg);

      VMutexLocker lock(m_processesMutex);
      CloseHandle(processHandle);
      m_processes.Remove(processHandle);
    }
  }
}