/*
|
* =====================================================================================
|
*
|
* 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<char *>(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<char *>(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<RefCount>();
|
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<RefCount>();
|
}
|
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
|