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); }
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; }