/* * ===================================================================================== * * 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::Alloc(SharedMemory &shm, const size_t size) { void *p = shm.Alloc(sizeof(Meta) + size); if (p) { auto pmeta = new (p) Meta; p = pmeta + 1; } return p; } void MsgI::Free(SharedMemory &shm) { assert(valid()); shm.Dealloc(meta()); ptr_ = nullptr; assert(!valid()); } void *MsgI::Pack(SharedMemory &shm, const uint32_t head_len, const ToArray &headToArray, const uint32_t body_len, const ToArray &bodyToArray) { void *addr = Alloc(shm, 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 = get(); assert(p); uint32_t msg_size = Get32(p); p += 4; return head.ParseFromArray(p, msg_size); } bool MsgI::Make(SharedMemory &shm, void *p) { if (!p) { return false; } MsgI(p).swap(*this); return true; } int MsgI::Release(SharedMemory &shm) { if (!valid()) { return 0; } auto n = meta()->count_.Dec(); if (n == 0) { Free(shm); } return n; } } // namespace bhome_msg