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)20void 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)34void 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