• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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