| | |
| | | return shm; |
| | | } |
| | | |
| | | } // namespace |
| | | |
| | | CenterInfo *GetCenterInfo(SharedMemory &shm) |
| | | { |
| | | auto pmeta = Ptr<CenterMetaInfo>(kCenterInfoFixedAddress + Addr(shm.get_address())); |
| | | if (pmeta->tag_ == kMetaInfoTag) { |
| | | return &pmeta->info_; |
| | | } |
| | | return nullptr; |
| | | } |
| | | |
| | | ShmSocket &DefaultSender(SharedMemory &shm) |
| | | ShmSocket &ShmSender(SharedMemory &shm, const bool reset) |
| | | { |
| | | typedef std::pair<void *, std::shared_ptr<ShmSocket>> Pair; |
| | | static std::vector<Pair> store; |
| | | static std::mutex s_mtx; |
| | | |
| | | thread_local Pair local_cache; |
| | | if (local_cache.first == &shm) { |
| | | |
| | | std::lock_guard<std::mutex> lk(s_mtx); |
| | | |
| | | if (reset) { |
| | | for (auto &kv : store) { |
| | | if (kv.first == &shm) { |
| | | auto &mq = GetCenterInfo(shm)->mq_sender_; |
| | | kv.second.reset(new ShmSocket(mq.offset_, shm, mq.id_)); |
| | | local_cache = kv; |
| | | return *local_cache.second; |
| | | } |
| | | } |
| | | } else if (local_cache.first == &shm) { |
| | | return *local_cache.second; |
| | | } |
| | | |
| | | std::lock_guard<std::mutex> lk(s_mtx); |
| | | for (auto &kv : store) { |
| | | if (kv.first == &shm) { |
| | | local_cache = kv; |
| | |
| | | local_cache = store.back(); |
| | | return *local_cache.second; |
| | | } |
| | | } // namespace |
| | | |
| | | CenterInfo *GetCenterInfo(SharedMemory &shm) |
| | | { |
| | | auto pmeta = Ptr<CenterMetaInfo>(kCenterInfoFixedAddress + Addr(shm.get_address())); |
| | | if (pmeta->tag_ == kMetaInfoTag) { |
| | | return &pmeta->info_; |
| | | } |
| | | return nullptr; |
| | | } |
| | | |
| | | ShmSocket &DefaultSender(SharedMemory &shm) { return ShmSender(shm, false); } |
| | | |
| | | BHomeMetaInfo *GetBHomeMeta() |
| | | { |
| | |
| | | |
| | | SharedMemory &BHomeShm() |
| | | { |
| | | static SharedMemory shm(BHomeShmName(), 1024 * 1024 * 512); |
| | | return shm; |
| | | static std::unique_ptr<SharedMemory> shm_ptr; |
| | | static std::string shm_name; |
| | | if (!shm_ptr || shm_name != BHomeShmName()) { |
| | | shm_name = BHomeShmName(); |
| | | if (shm_ptr) { |
| | | ShmSender(*shm_ptr, true); // reset sender. |
| | | } |
| | | shm_ptr.reset(new SharedMemory(shm_name, 1024 * 1024 * 512)); |
| | | } |
| | | return *shm_ptr; |
| | | } |
| | | |
| | | bool GlobalInit(SharedMemory &shm) { return GetCenterInfo(shm); } |