• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ecmascript/waiter_list.h"
17 
18 namespace panda::ecmascript {
19 // --------------------------WaiterList------------------------------
AddNode(WaiterListNode * node)20 void WaiterList::AddNode(WaiterListNode *node)
21 {
22     ASSERT(node->prev_ == nullptr);
23     ASSERT(node->next_ == nullptr);
24     auto iter = locationListMap_.find(node->waitPointer_);
25     if (iter != locationListMap_.end()) {
26         iter->second.pTail->next_ = node;
27         node->prev_ = iter->second.pTail;
28         iter->second.pTail = node;
29     } else {
30         locationListMap_.emplace(node->waitPointer_, HeadAndTail {node, node});
31     }
32 }
33 
DeleteNode(WaiterListNode * node)34 void WaiterList::DeleteNode(WaiterListNode *node)
35 {
36     auto iter = locationListMap_.find(node->waitPointer_);
37     ASSERT(iter != locationListMap_.end());
38     WaiterListNode *temp = iter->second.pHead;
39     [[maybe_unused]] bool flag = false;
40     while (temp != nullptr) {
41         if (temp == node) {
42             flag = true;
43             break;
44         }
45         temp = temp->next_;
46     }
47     ASSERT(flag);
48     if (node == iter->second.pHead && node == iter->second.pTail) {
49         locationListMap_.erase(iter);
50         return;
51     }
52 
53     if (node == iter->second.pHead) {
54         iter->second.pHead = node->next_;
55     } else {
56         ASSERT(node->prev_);
57         node->prev_->next_ = node->next_;
58     }
59 
60     if (node == iter->second.pTail) {
61         iter->second.pTail = node->prev_;
62     } else {
63         ASSERT(node->next_);
64         node->next_->prev_ = node->prev_;
65     }
66 
67     node->prev_ = node->next_ = nullptr;
68 }
69 }  // namespace
70