1 /* 2 * Copyright (c) 2024 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 #ifndef ECMASCRIPT_MEM_SHARED_HEAP_SHARED_CONCURRENT_SWEEPER_H 17 #define ECMASCRIPT_MEM_SHARED_HEAP_SHARED_CONCURRENT_SWEEPER_H 18 19 #include "ecmascript/mem/concurrent_sweeper.h" 20 21 namespace panda::ecmascript { 22 class SharedHeap; 23 24 class SharedConcurrentSweeper { 25 public: 26 SharedConcurrentSweeper(SharedHeap *heap, EnableConcurrentSweepType type); 27 ~SharedConcurrentSweeper() = default; 28 29 NO_COPY_SEMANTIC(SharedConcurrentSweeper); 30 NO_MOVE_SEMANTIC(SharedConcurrentSweeper); 31 32 void PostTask(bool isFullGC); 33 void Sweep(bool isFullGC); 34 35 void WaitAllTaskFinished(); 36 // Help to finish sweeping task. It can be called through js thread 37 void EnsureAllTaskFinished(); 38 // Ensure task finish. It can be called through js thread 39 void EnsureTaskFinished(MemSpaceType type); 40 41 void TryFillSweptRegion(); 42 43 void EnableConcurrentSweep(EnableConcurrentSweepType type); 44 IsSweeping()45 bool IsSweeping() 46 { 47 return isSweeping_; 48 } 49 ConcurrentSweepEnabled()50 bool ConcurrentSweepEnabled() 51 { 52 return !IsDisabled(); 53 } 54 ConfigConcurrentSweep(bool enabled)55 void ConfigConcurrentSweep(bool enabled) 56 { 57 enableType_ = enabled ? EnableConcurrentSweepType::ENABLE : 58 EnableConcurrentSweepType::CONFIG_DISABLE; 59 } 60 IsDisabled() const61 bool IsDisabled() const 62 { 63 return enableType_ == EnableConcurrentSweepType::DISABLE || 64 enableType_ == EnableConcurrentSweepType::CONFIG_DISABLE; 65 } 66 IsRequestDisabled() const67 bool IsRequestDisabled() const 68 { 69 return enableType_ == EnableConcurrentSweepType::REQUEST_DISABLE; 70 } 71 IsConfigDisabled() const72 bool IsConfigDisabled() const 73 { 74 return enableType_ == EnableConcurrentSweepType::CONFIG_DISABLE; 75 } 76 private: 77 class SweeperTask : public Task { 78 public: SweeperTask(int32_t id, SharedConcurrentSweeper *sweeper, MemSpaceType type)79 SweeperTask(int32_t id, SharedConcurrentSweeper *sweeper, MemSpaceType type) 80 : Task(id), sweeper_(sweeper), type_(type) {}; 81 ~SweeperTask() override = default; 82 bool Run(uint32_t threadIndex) override; 83 84 NO_COPY_SEMANTIC(SweeperTask); 85 NO_MOVE_SEMANTIC(SweeperTask); 86 87 private: 88 SharedConcurrentSweeper *sweeper_; 89 MemSpaceType type_; 90 }; 91 92 void AsyncSweepSpace(MemSpaceType type, bool isMain); 93 94 void WaitingTaskFinish(MemSpaceType type); 95 96 std::array<Mutex, SHARED_SWEEPING_SPACE_NUM> mutexs_; 97 std::array<ConditionVariable, SHARED_SWEEPING_SPACE_NUM> cvs_; 98 std::array<std::atomic_int, SHARED_SWEEPING_SPACE_NUM> remainingTaskNum_ = {0, 0}; 99 100 SharedHeap *sHeap_; 101 EnableConcurrentSweepType enableType_ {EnableConcurrentSweepType::CONFIG_DISABLE}; 102 bool isSweeping_ {false}; 103 bool isFullGC_ {false}; 104 }; 105 } // namespace panda::ecmascript 106 #endif // ECMASCRIPT_MEM_SHARED_HEAP_SHARED_CONCURRENT_SWEEPER_H 107