Apollo 10.0
自动驾驶开放平台
arena_address_allocator.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2024 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#ifndef CYBER_TRANSPORT_SHM_ARENA_ADDRESS_ALLOCATOR_H_
17#define CYBER_TRANSPORT_SHM_ARENA_ADDRESS_ALLOCATOR_H_
18
19#include <atomic>
20#include <cstdint>
21
23#include "cyber/common/macros.h"
24
25namespace apollo {
26namespace cyber {
27namespace transport {
28
30 uint64_t key_;
31 uint64_t index_;
32 std::atomic<uint64_t> ref_count_;
36};
37
39 struct {
40 uint64_t version_;
41 uint64_t capacity_;
42 std::atomic<uint64_t> ref_count_;
44 // TODO(ALL): support multiple size
49 // base::PthreadRWLock mutex_;
50 std::atomic<bool> occupied_;
52 uint8_t bytes_[128];
53};
54
56 public:
59
60 bool Init(uint64_t capacity, void* base_address,
61 uint64_t address_segment_size);
62
63 bool OpenOrCreate(uint64_t key, uint64_t size, void* base_address,
64 void** shm_address, bool* is_created);
65 bool Open(uint64_t key, void* base_address, void** shm_address);
66
67 bool OpenOrCreate(uint64_t capacity, void* base_address,
68 uint64_t address_segment_size);
69
70 bool OpenMetaShm(uint64_t capacity, void* base_address,
71 uint64_t address_segment_size);
72
73 bool OpenNodeShm(uint64_t capacity, void* base_address,
74 uint64_t address_segment_size);
75
76 ArenaAddressNode* NewNode(uint64_t key);
77 void ReclaimNode(ArenaAddressNode* node);
78 ArenaAddressNode* FindNode(ArenaAddressNode* node, uint64_t key);
80 ArenaAddressNode** node_p,
81 ArenaAddressNode* parent, uint64_t key);
82 void RemoveNode(ArenaAddressNode* node, ArenaAddressNode** node_addr,
83 uint64_t key);
86 uint64_t TreeHeight(ArenaAddressNode* node);
88 ArenaAddressNode*** node_pp);
90 ArenaAddressNode*** node_pp);
93 ArenaAddressNode** node_p);
95 ArenaAddressNode** node_p);
97 ArenaAddressNode** node_p);
99 ArenaAddressNode** node_p);
101 ArenaAddressNode** node_p);
102 void* Allocate(uint64_t key);
103 void Deallocate(uint64_t key);
104
105 private:
106 uint64_t meta_shm_key_;
107 uint64_t node_shm_key_;
108 void* meta_shm_address_;
109 void* node_shm_address_;
111 ArenaAddressNode* nodes_;
112 ArenaAddressNode* root_;
113 uint64_t* reclaim_stack_;
114 // DECLARE_SINGLETON(ArenaAddressAllocator)
115};
116
117} // namespace transport
118} // namespace cyber
119} // namespace apollo
120
121#endif
ArenaAddressNode * TreeRotateLeftRight(ArenaAddressNode *node, ArenaAddressNode **node_p)
ArenaAddressNode * TreeMax(ArenaAddressNode *node, ArenaAddressNode ***node_pp)
ArenaAddressNode * TreeRebalance(ArenaAddressNode *node, ArenaAddressNode **node_p)
void SwapNodePosition(ArenaAddressNode *x, ArenaAddressNode **x_p, ArenaAddressNode *y, ArenaAddressNode **y_p)
ArenaAddressNode * TreeRotateLeft(ArenaAddressNode *node, ArenaAddressNode **node_p)
ArenaAddressNode * FindNode(ArenaAddressNode *node, uint64_t key)
bool OpenOrCreate(uint64_t key, uint64_t size, void *base_address, void **shm_address, bool *is_created)
bool OpenOrCreate(uint64_t capacity, void *base_address, uint64_t address_segment_size)
bool Open(uint64_t key, void *base_address, void **shm_address)
bool OpenMetaShm(uint64_t capacity, void *base_address, uint64_t address_segment_size)
ArenaAddressNode * TreeRotateRightLeft(ArenaAddressNode *node, ArenaAddressNode **node_p)
ArenaAddressNode * TreeMin(ArenaAddressNode *node, ArenaAddressNode ***node_pp)
ArenaAddressNode * TreeRotateRight(ArenaAddressNode *node, ArenaAddressNode **node_p)
void RemoveNode(ArenaAddressNode *node, ArenaAddressNode **node_addr, uint64_t key)
bool Init(uint64_t capacity, void *base_address, uint64_t address_segment_size)
ArenaAddressNode * FindOrInsertNode(ArenaAddressNode *node, ArenaAddressNode **node_p, ArenaAddressNode *parent, uint64_t key)
bool OpenNodeShm(uint64_t capacity, void *base_address, uint64_t address_segment_size)
class register implement
Definition arena_queue.h:37
struct apollo::cyber::transport::ArenaAddressAllocatorMeta::@2 struct_