Apollo 10.0
自动驾驶开放平台
segment.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
17#ifndef CYBER_TRANSPORT_SHM_SEGMENT_H_
18#define CYBER_TRANSPORT_SHM_SEGMENT_H_
19
20#include <memory>
21#include <mutex>
22#include <string>
23#include <unordered_map>
24
28
29namespace apollo {
30namespace cyber {
31namespace transport {
32
33class Segment;
34using SegmentPtr = std::shared_ptr<Segment>;
35
37 uint32_t index = 0;
38 Block* block = nullptr;
39 uint8_t* buf = nullptr;
40};
42
43class Segment {
44 public:
45 explicit Segment(uint64_t channel_id);
46 virtual ~Segment() {}
47
48 bool AcquireBlockToWrite(std::size_t msg_size, WritableBlock* writable_block);
49 void ReleaseWrittenBlock(const WritableBlock& writable_block);
50
52 std::size_t msg_size, WritableBlock* writable_block);
53 void ReleaseArenaWrittenBlock(const WritableBlock& writable_block);
54
55 bool AcquireBlockToRead(ReadableBlock* readable_block);
56 void ReleaseReadBlock(const ReadableBlock& readable_block);
57
58 bool AcquireArenaBlockToRead(ReadableBlock* readable_block);
59 void ReleaseArenaReadBlock(const ReadableBlock& readable_block);
60
61 bool InitOnly(uint64_t message_size);
62 void* GetManagedShm();
63 bool LockBlockForWriteByIndex(uint64_t block_index);
64 bool ReleaseBlockForWriteByIndex(uint64_t block_index);
65 bool LockBlockForReadByIndex(uint64_t block_index);
66 bool ReleaseBlockForReadByIndex(uint64_t block_index);
67
68 bool LockArenaBlockForWriteByIndex(uint64_t block_index);
69 bool ReleaseArenaBlockForWriteByIndex(uint64_t block_index);
70 bool LockArenaBlockForReadByIndex(uint64_t block_index);
71 bool ReleaseArenaBlockForReadByIndex(uint64_t block_index);
72
73 protected:
74 virtual bool Destroy();
75 virtual void Reset() = 0;
76 virtual bool Remove() = 0;
77 virtual bool OpenOnly() = 0;
78 virtual bool OpenOrCreate() = 0;
79
80 bool init_;
82 uint64_t channel_id_;
83
88 std::mutex block_buf_lock_;
90 std::unordered_map<uint32_t, uint8_t*> block_buf_addrs_;
91 std::unordered_map<uint32_t, uint8_t*> arena_block_buf_addrs_;
92
93 private:
94 bool Remap();
95 bool Recreate(const uint64_t& msg_size);
96 uint32_t GetNextWritableBlockIndex();
97 uint32_t GetNextArenaWritableBlockIndex();
98};
99
100} // namespace transport
101} // namespace cyber
102} // namespace apollo
103
104#endif // CYBER_TRANSPORT_SHM_SEGMENT_H_
bool AcquireBlockToRead(ReadableBlock *readable_block)
Definition segment.cc:107
bool ReleaseArenaBlockForReadByIndex(uint64_t block_index)
Definition segment.cc:250
bool AcquireArenaBlockToWrite(std::size_t msg_size, WritableBlock *writable_block)
Definition segment.cc:72
bool LockArenaBlockForReadByIndex(uint64_t block_index)
Definition segment.cc:243
void ReleaseReadBlock(const ReadableBlock &readable_block)
Definition segment.cc:177
bool ReleaseBlockForReadByIndex(uint64_t block_index)
Definition segment.cc:220
bool InitOnly(uint64_t message_size)
Definition segment.cc:185
bool AcquireBlockToWrite(std::size_t msg_size, WritableBlock *writable_block)
Definition segment.cc:40
bool LockArenaBlockForWriteByIndex(uint64_t block_index)
Definition segment.cc:228
std::unordered_map< uint32_t, uint8_t * > block_buf_addrs_
Definition segment.h:90
bool LockBlockForWriteByIndex(uint64_t block_index)
Definition segment.cc:198
bool ReleaseArenaBlockForWriteByIndex(uint64_t block_index)
Definition segment.cc:235
bool AcquireArenaBlockToRead(ReadableBlock *readable_block)
Definition segment.cc:138
bool ReleaseBlockForWriteByIndex(uint64_t block_index)
Definition segment.cc:205
void ReleaseWrittenBlock(const WritableBlock &writable_block)
Definition segment.cc:91
bool LockBlockForReadByIndex(uint64_t block_index)
Definition segment.cc:213
std::unordered_map< uint32_t, uint8_t * > arena_block_buf_addrs_
Definition segment.h:91
void ReleaseArenaWrittenBlock(const WritableBlock &writable_block)
Definition segment.cc:99
void ReleaseArenaReadBlock(const ReadableBlock &readable_block)
Definition segment.cc:169
int message_size
std::shared_ptr< Segment > SegmentPtr
Definition segment.h:34
class register implement
Definition arena_queue.h:37