1 /* 2 * Copyright (c) 2024-2025 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 PLUGINS_ETS_RUNTIME_INTEROP_JS_STS_VM_INTERFACE_IMPL_H 17 #define PLUGINS_ETS_RUNTIME_INTEROP_JS_STS_VM_INTERFACE_IMPL_H 18 19 #include <atomic> 20 #include <functional> 21 // arkplatform 22 #include "hybrid/sts_vm_interface.h" 23 24 #include "libpandabase/macros.h" 25 #include "libpandabase/os/mutex.h" 26 27 namespace ark::ets::interop::js { 28 29 namespace testing { 30 class STSVMInterfaceImplTest; 31 } // namespace testing 32 33 class STSVMInterfaceImpl final : public arkplatform::STSVMInterface { 34 public: 35 NO_COPY_SEMANTIC(STSVMInterfaceImpl); 36 NO_MOVE_SEMANTIC(STSVMInterfaceImpl); 37 PANDA_PUBLIC_API STSVMInterfaceImpl(); 38 PANDA_PUBLIC_API ~STSVMInterfaceImpl() override = default; 39 40 PANDA_PUBLIC_API void MarkFromObject(void *obj) override; 41 42 PANDA_PUBLIC_API void OnVMAttach() override; 43 PANDA_PUBLIC_API void OnVMDetach() override; 44 45 PANDA_PUBLIC_API bool StartXGCBarrier(const NoWorkPred &func) override; 46 PANDA_PUBLIC_API bool WaitForConcurrentMark(const NoWorkPred &func) override; 47 PANDA_PUBLIC_API void RemarkStartBarrier() override; 48 PANDA_PUBLIC_API bool WaitForRemark(const NoWorkPred &func) override; 49 PANDA_PUBLIC_API void FinishXGCBarrier() override; 50 51 PANDA_PUBLIC_API void NotifyWaiters(); 52 53 private: 54 enum class XGCSyncState { NONE, CONCURRENT_PHASE, CONCURRENT_FINISHED, REMARK_PHASE }; 55 56 class VMBarrier { 57 public: 58 NO_COPY_SEMANTIC(VMBarrier); 59 NO_MOVE_SEMANTIC(VMBarrier); 60 61 PANDA_PUBLIC_API explicit VMBarrier(size_t vmsCount); 62 PANDA_PUBLIC_API ~VMBarrier() = default; 63 64 PANDA_PUBLIC_API void Increment(); 65 PANDA_PUBLIC_API void Decrement(); 66 67 PANDA_PUBLIC_API bool InitialWait(const NoWorkPred &noWorkPred = nullptr); 68 PANDA_PUBLIC_API bool Wait(const NoWorkPred &noWorkPred = nullptr); 69 PANDA_PUBLIC_API void Signal(); 70 71 private: 72 bool Wait(const NoWorkPred &noWorkPred, bool isInitial); 73 74 bool WaitNextEpochOrSignal(const NoWorkPred &noWorkPred) REQUIRES(barrierMutex_); 75 size_t IncrementCurrentWaitersCount() REQUIRES(barrierMutex_); 76 void Wake() REQUIRES(barrierMutex_); 77 CheckNoWorkPred(const NoWorkPred & noWorkPred)78 bool CheckNoWorkPred(const NoWorkPred &noWorkPred) 79 { 80 return noWorkPred && !noWorkPred(); 81 } 82 83 os::memory::Mutex barrierMutex_; 84 os::memory::ConditionVariable condVar_ GUARDED_BY(barrierMutex_); 85 86 size_t currentVMsCount_ GUARDED_BY(barrierMutex_); 87 size_t vmsCount_ GUARDED_BY(barrierMutex_); 88 size_t epochCount_ GUARDED_BY(barrierMutex_); 89 size_t currentWaitersCount_ GUARDED_BY(barrierMutex_); 90 size_t weakCount_ GUARDED_BY(barrierMutex_); 91 }; 92 93 VMBarrier xgcBarrier_; 94 // xgcSyncState_ is used only for debug 95 thread_local static XGCSyncState xgcSyncState_; 96 97 // friend test class to access internal structures 98 friend class testing::STSVMInterfaceImplTest; 99 }; 100 101 } // namespace ark::ets::interop::js 102 103 #endif // PLUGINS_ETS_RUNTIME_INTEROP_JS_STS_VM_INTERFACE_IMPL_H 104