32 std::hash<
std::string>{}(
"/apollo/__arena__/__address__/__meta__")),
34 std::hash<std::string>{}(
"/apollo/__arena__/__address__/__node__")),
37 reclaim_stack_(
nullptr) {
39 meta_shm_address_ =
nullptr;
41 node_shm_address_ =
reinterpret_cast<void*
>(0x7f0000000000);
46 Init(1024,
reinterpret_cast<void*
>(
47 0x710000000000), 2ULL * 1024 * 1024 * 1024);
53 shmctl(shmget(meta_shm_key_, 0, 0), IPC_RMID,
nullptr);
55 shmctl(shmget(node_shm_key_, 0, 0), IPC_RMID,
nullptr);
60 uint64_t address_segment_size) {
61 if (!
OpenMetaShm(capacity, base_address, address_segment_size)) {
64 if (!
OpenNodeShm(capacity, base_address, address_segment_size)) {
73 auto shmid = shmget(
static_cast<key_t
>(key), 0, 0);
75 shmid = shmget(
static_cast<key_t
>(key), 0, 0);
80 *shm_address = shmat(shmid, base_address, 0);
81 if (*shm_address ==
reinterpret_cast<void*
>(-1)) {
89 void* base_address,
void** shm_address,
92 shmget(
static_cast<key_t
>(key), size, 0644 | IPC_CREAT | IPC_EXCL);
95 if (errno == EINVAL) {
97 }
else if (errno == EEXIST) {
99 return Open(key, base_address, shm_address);
104 *shm_address = shmat(shmid, base_address, 0);
105 if (*shm_address ==
reinterpret_cast<void*
>(-1)) {
114 uint64_t address_segment_size) {
115 bool is_created =
false;
117 for (uint32_t retry = 0; retry < 2 && !ret;
120 meta_shm_address_,
reinterpret_cast<void**
>(&meta_),
143 uint64_t address_segment_size) {
146 sizeof(uint64_t) * capacity;
147 bool is_created =
false;
149 for (uint32_t retry = 0; retry < 2 && !ret;
150 ++retry, ret =
OpenOrCreate(node_shm_key_, size, node_shm_address_,
151 reinterpret_cast<void**
>(&nodes_),
159 reclaim_stack_ =
reinterpret_cast<uint64_t*
>(
167 nodes_[index].
left_ =
nullptr;
168 nodes_[index].
right_ =
nullptr;
169 nodes_[index].
key_ = key;
170 return &nodes_[index];
193 if (node ==
nullptr) {
196 if (key < node->key_) {
198 }
else if (key > node->
key_) {
207 if (node ==
nullptr) {
213 if (key < node->key_) {
217 }
else if (key > node->
key_) {
235 if (key < node->key_) {
241 }
else if (key > node->
key_) {
252 auto max_p = &(node->
left_);
258 auto min_p = &(node->
right_);
274 if (x ==
nullptr || y ==
nullptr) {
314 if (node ==
nullptr) {
322 if (node ==
nullptr) {
326 *node_pp = &(node->
right_);
334 if (node ==
nullptr) {
337 for (; node->
left_;) {
338 *node_pp = &(node->
left_);
345 if (node ==
nullptr) {
354 auto right = node->
right_;
368 auto left = node->
left_;
393 if (node ==
nullptr) {
397 if (balance_factor > 1) {
403 }
else if (balance_factor < -1) {
414 bool idle_status =
false;
415 bool occupied_status =
true;
417 idle_status, occupied_status)) {
420 std::this_thread::sleep_for(std::chrono::microseconds(1000));
425 if (node ==
nullptr) {
429 node->ref_count_.fetch_add(1);
431 return reinterpret_cast<void*
>(
437 bool idle_status =
false;
438 bool occupied_status =
true;
440 idle_status, occupied_status)) {
443 std::this_thread::sleep_for(std::chrono::microseconds(1000));
447 if (node ==
nullptr) {
451 if (node->ref_count_.fetch_sub(1) == 0) {
ArenaAddressNode * TreeRotateLeftRight(ArenaAddressNode *node, ArenaAddressNode **node_p)
uint64_t TreeHeight(ArenaAddressNode *node)
void Deallocate(uint64_t key)
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 Open(uint64_t key, void *base_address, void **shm_address)
bool OpenMetaShm(uint64_t capacity, void *base_address, uint64_t address_segment_size)
void ReclaimNode(ArenaAddressNode *node)
ArenaAddressNode * TreeRotateRightLeft(ArenaAddressNode *node, ArenaAddressNode **node_p)
int64_t TreeBalanceFactor(ArenaAddressNode *node)
ArenaAddressNode * NewNode(uint64_t key)
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)
void * Allocate(uint64_t key)
bool OpenNodeShm(uint64_t capacity, void *base_address, uint64_t address_segment_size)
bool Init(const char *binary_name, const std::string &dag_info)
struct ArenaAddressNode * right_
struct ArenaAddressNode * parent_
struct ArenaAddressNode * left_