Пример #1
0
void petabricks::RemoteHost::createRemoteObject(const RemoteObjectPtr& local,
                                                RemoteObjectGenerator remote,
                                                const void* data, size_t len){
  local->markInitiatorMu();
  local->setHostMu(this);
  GeneralMessage msg = { MessageTypes::REMOTEOBJECT_CREATE,
                         0,
                         len,
                         EncodeDataPtr(local.asPtr()),
                         EncodeTextPtr(remote) };
  sendMsg(&msg, data, len);
  JLOCKSCOPE(_controlmu);
  _objects.push_back(local);
}
Пример #2
0
bool petabricks::RemoteHost::recv() {
  GeneralMessage msg;

  if(!_controlmu.trylock()) {
    JTRACE("skipping recv, locked");
    return false;
  }

  ssize_t cnt = _control.tryReadAll((char*)&msg, sizeof msg);
  if(cnt==0) {
    _controlmu.unlock();
    return false;
  }
  if(cnt<0) {
    _controlmu.unlock();
    JASSERT(false)(_id).Text("disconnected");
    return false;
  }
  JASSERT(cnt==sizeof msg)(cnt);

  if(msg.len>0){
    JASSERT(msg.chan>=0 && msg.chan<REMOTEHOST_DATACHANS);
    _datamu[msg.chan].lock();
  }
  _controlmu.unlock();
  RemoteObjectGenerator gen = 0;
  RemoteObjectPtr obj = 0;
  void* buf = 0;

  switch(msg.type) {
  case MessageTypes::REMOTEOBJECT_CREATE: 
    {
      gen = DecodeTextPtr<RemoteObjectGenerator>(msg.dstptr);
      obj = (*gen)();
      JLOCKSCOPE(*obj);
      obj->setHostMu(this);
      obj->setRemoteObjMu(msg.srcptr);
      if(msg.len>0){
        buf = obj->allocRecvInitial(msg.len);
        _data[msg.chan].readAll((char*)buf, msg.len);
        _datamu[msg.chan].unlock();
        obj->onRecvInitial(buf, msg.len);
        obj->freeRecvInitial(buf, msg.len);
      }
      obj->onCreated();
      obj->markCreatedMu();
      { GeneralMessage ackmsg = { MessageTypes::REMOTEOBJECT_CREATE_ACK, 0, 0, EncodeDataPtr(obj.asPtr()), msg.srcptr };
        sendMsg(&ackmsg);
      }
      JLOCKSCOPE(_controlmu);
      _objects.push_back(obj);
      break;
    }
  case MessageTypes::REMOTEOBJECT_CREATE_ACK:
    {
      obj = DecodeDataPtr<RemoteObject>(msg.dstptr);
      JASSERT(msg.len==0);
      JLOCKSCOPE(*obj);
      obj->setRemoteObjMu(msg.srcptr);
      obj->onCreated();
      obj->markCreatedMu();
      break;
    }
  case MessageTypes::REMOTEOBJECT_DATA:
    {
      obj = DecodeDataPtr<RemoteObject>(msg.dstptr);
      JLOCKSCOPE(*obj);
      if(msg.len>0){
        buf = obj->allocRecv(msg.len);
        _data[msg.chan].readAll((char*)buf, msg.len);
        _datamu[msg.chan].unlock();
        obj->onRecv(buf, msg.len);
        obj->freeRecv(buf, msg.len);
      }
      break;
    }
  case MessageTypes::REMOTEOBJECT_SIGNAL:
    {
      obj = DecodeDataPtr<RemoteObject>(msg.dstptr);
      JASSERT(msg.len==0);
      JLOCKSCOPE(*obj);
      obj->signal();
      break;
    }
  case MessageTypes::REMOTEOBJECT_BROADCAST:
    {
      obj = DecodeDataPtr<RemoteObject>(msg.dstptr);
      JASSERT(msg.len==0);
      JLOCKSCOPE(*obj);
      obj->broadcast();
      break;
    }
  case MessageTypes::REMOTEOBJECT_NOTIFY:
    {
      obj = DecodeDataPtr<RemoteObject>(msg.dstptr);
      JASSERT(msg.len==0);
      JLOCKSCOPE(*obj);
      obj->onNotify(msg.srcptr);
      break;
    }
  case MessageTypes::REMOTEOBJECT_MARKCOMPLETE:
    {
      obj = DecodeDataPtr<RemoteObject>(msg.dstptr);
      JASSERT(msg.len==0);
      JLOCKSCOPE(*obj);
      obj->onComplete();
      obj->markCompleteMu();
      break;
    }
  default:
    JASSERT(false);
  }
  return true;
}