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