| | |
| | | * ===================================================================================== |
| | | */ |
| | | #include "msg.h" |
| | | #include "bh_util.h" |
| | | #include "defs.h" |
| | | #include "shm_socket.h" |
| | | |
| | | namespace bhome_shm { |
| | | |
| | | |
| | | bool MsgMetaV1::Parse(const void *p) |
| | | namespace bhome_msg |
| | | { |
| | | assert(p); |
| | | *this = *static_cast<const MsgMetaV1*>(p); |
| | | return tag_ == kMsgMetaTag; |
| | | |
| | | int ShmMsg::Release() |
| | | { |
| | | if (!valid()) { |
| | | return 0; |
| | | } |
| | | auto n = meta()->count_.Dec(); |
| | | if (n == 0) { |
| | | if (meta()->managed_) { |
| | | int64_t free_cmd = (id() << 4) | EncodeCmd(eCmdFree); |
| | | DefaultSender(shm()).Send(BHTopicCenterAddress(shm()), free_cmd); |
| | | } else { |
| | | Free(); |
| | | } |
| | | } else if (n < 0) { |
| | | // ns_log::GetTrace(); |
| | | LOG_FATAL() << "double release msg."; |
| | | throw std::runtime_error("double release msg."); |
| | | } |
| | | return n; |
| | | } |
| | | |
| | | void MsgMetaV1::Pack(void *p) |
| | | void ShmMsg::Free() |
| | | { |
| | | *static_cast<MsgMetaV1*>(p) = *this; |
| | | assert(valid()); |
| | | shm().Dealloc(meta()); |
| | | offset_ = 0; |
| | | assert(!valid()); |
| | | } |
| | | |
| | | bool Msg::Build(SharedMemory &shm, const MQId &src_id, const void *data, const size_t size, const bool refcount) |
| | | { |
| | | if (!data || !size) { |
| | | return false; |
| | | } |
| | | void *p = shm.Alloc(sizeof(MsgMetaV1) + size); |
| | | if (!p) { |
| | | return false; |
| | | } |
| | | RefCount *rc = 0; |
| | | if (refcount) { |
| | | rc = shm.New<RefCount>(); |
| | | if (!rc) { |
| | | shm.Dealloc(p); |
| | | return false; |
| | | } |
| | | } |
| | | MsgMetaV1 meta; |
| | | meta.data_size_ = size; |
| | | meta.src_id_ = src_id; |
| | | meta.Pack(p); |
| | | memcpy(static_cast<char *>(p) + sizeof(meta), data, size); |
| | | Msg(p, rc).swap(*this); |
| | | return true; |
| | | |
| | | } |
| | | |
| | | int Msg::Release(SharedMemory &shm) const |
| | | { |
| | | if (IsCounted()) { |
| | | const int n = count_->Dec(); |
| | | if (n != 0) { |
| | | return n; |
| | | } |
| | | } |
| | | // free data |
| | | shm.Dealloc(ptr_); |
| | | shm.Delete(count_); |
| | | return 0; |
| | | } |
| | | |
| | | } // namespace bhome_shm |
| | | } // namespace bhome_msg |