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