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 namespace panda::ecmascript { 18 // --------------------------WaiterList------------------------------ AddNode(WaiterListNode * node)19void WaiterList::AddNode(WaiterListNode *node) 20 { 21 ASSERT(node->prev_ == nullptr); 22 ASSERT(node->next_ == nullptr); 23 auto iter = locationListMap_.find(node->waitPointer_); 24 if (iter != locationListMap_.end()) { 25 iter->second.pTail->next_ = node; 26 node->prev_ = iter->second.pTail; 27 iter->second.pTail = node; 28 } else { 29 locationListMap_.emplace(node->waitPointer_, HeadAndTail {node, node}); 30 } 31 } 32 DeleteNode(WaiterListNode * node)33void WaiterList::DeleteNode(WaiterListNode *node) 34 { 35 auto iter = locationListMap_.find(node->waitPointer_); 36 ASSERT(iter != locationListMap_.end()); 37 WaiterListNode *temp = iter->second.pHead; 38 [[maybe_unused]] bool flag = false; 39 while (temp != nullptr) { 40 if (temp == node) { 41 flag = true; 42 break; 43 } 44 temp = temp->next_; 45 } 46 ASSERT(flag); 47 if (node == iter->second.pHead && node == iter->second.pTail) { 48 locationListMap_.erase(iter); 49 return; 50 } 51 52 if (node == iter->second.pHead) { 53 iter->second.pHead = node->next_; 54 } else { 55 ASSERT(node->prev_); 56 node->prev_->next_ = node->next_; 57 } 58 59 if (node == iter->second.pTail) { 60 iter->second.pTail = node->prev_; 61 } else { 62 ASSERT(node->next_); 63 node->next_->prev_ = node->prev_; 64 } 65 66 node->prev_ = node->next_ = nullptr; 67 } 68 } // namespace 69