/* * ===================================================================================== * * Filename: msg.cpp * * Description: * * Version: 1.0 * Created: 2021年03月24日 16时48分42秒 * Revision: none * Compiler: gcc * * Author: Li Chao (), * Organization: * * ===================================================================================== */ #include "msg.h" #include "bh_util.h" namespace bhome_msg { /*TODO change msg format, header has proc info; reply has errer msg center accept request and route.; //*/ const uint32_t kMsgTag = 0xf1e2d3c4; void *MsgI::Pack(SharedMemory &shm, const uint32_t head_len, const ToArray &headToArray, const uint32_t body_len, const ToArray &bodyToArray) { void *addr = shm.Alloc(sizeof(head_len) + head_len + sizeof(body_len) + body_len); if (addr) { auto p = static_cast(addr); auto Pack1 = [&p](auto len, auto &writer) { Put32(p, len); p += sizeof(len); writer(p, len); p += len; }; Pack1(head_len, headToArray); Pack1(body_len, bodyToArray); } return addr; } bool MsgI::ParseHead(BHMsgHead &head) const { auto p = static_cast(ptr_.get()); assert(p); uint32_t msg_size = Get32(p); p += 4; return head.ParseFromArray(p, msg_size); } // with ref count; bool MsgI::MakeRC(SharedMemory &shm, void *p) { if (!p) { return false; } RefCount *rc = shm.New(); if (!rc) { shm.Dealloc(p); return false; } MsgI(p, rc).swap(*this); return true; } bool MsgI::Make(SharedMemory &shm, void *p) { if (!p) { return false; } MsgI(p, 0).swap(*this); return true; } bool MsgI::EnableRefCount(SharedMemory &shm) { if (!IsCounted()) { count_ = shm.New(); } return IsCounted(); } int MsgI::Release(SharedMemory &shm) { if (IsCounted()) { const int n = count_->Dec(); if (n != 0) { return n; } } // free data shm.Dealloc(ptr_); ptr_ = 0; shm.Delete(count_); count_ = 0; return 0; } } // namespace bhome_msg