• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 PANDA_RUNTIME_CORE_CORE_VM_H_
17 #define PANDA_RUNTIME_CORE_CORE_VM_H_
18 
19 #include "libpandabase/macros.h"
20 #include "libpandabase/utils/expected.h"
21 #include "runtime/include/mem/panda_smart_pointers.h"
22 #include "runtime/include/mem/panda_string.h"
23 #include "runtime/mem/gc/gc_phase.h"
24 #include "runtime/mem/refstorage/reference.h"
25 #include "runtime/include/panda_vm.h"
26 #include "runtime/mem/refstorage/reference.h"
27 
28 namespace panda {
29 
30 class Method;
31 class Runtime;
32 
33 namespace core {
34 
35 class PandaCoreVM : public PandaVM {
36 public:
37     static Expected<PandaCoreVM *, PandaString> Create(Runtime *runtime, const RuntimeOptions &options);
38     ~PandaCoreVM() override;
39 
40     static PandaCoreVM *GetCurrent();
41 
42     bool Initialize() override;
43     bool InitializeFinish() override;
44     void UninitializeThreads() override;
45 
46     void PreStartup() override;
47     void PreZygoteFork() override;
48     void PostZygoteFork() override;
49     void InitializeGC() override;
50     void StartGC() override;
51     void StopGC() override;
52 
53     void HandleReferences(const GCTask &task) override;
54     void HandleEnqueueReferences() override;
55     void HandleGCFinished() override;
56 
57     void VisitVmRoots(const GCRootVisitor &visitor) override;
UpdateVmRefs()58     void UpdateVmRefs() override {}
59 
GetHeapManager()60     mem::HeapManager *GetHeapManager() const override
61     {
62         return mm_->GetHeapManager();
63     }
64 
GetGC()65     mem::GC *GetGC() const override
66     {
67         return mm_->GetGC();
68     }
69 
GetGCTrigger()70     mem::GCTrigger *GetGCTrigger() const override
71     {
72         return mm_->GetGCTrigger();
73     }
74 
GetGCStats()75     mem::GCStats *GetGCStats() const override
76     {
77         return mm_->GetGCStats();
78     }
79 
GetAssociatedThread()80     ManagedThread *GetAssociatedThread() const override
81     {
82         return ManagedThread::GetCurrent();
83     }
84 
GetStringTable()85     StringTable *GetStringTable() const override
86     {
87         return string_table_;
88     }
89 
GetMemStats()90     mem::MemStatsType *GetMemStats() const override
91     {
92         return mm_->GetMemStats();
93     }
94 
GetOptions()95     const RuntimeOptions &GetOptions() const override
96     {
97         return Runtime::GetOptions();
98     }
99 
GetThreadManager()100     ThreadManager *GetThreadManager() const override
101     {
102         return thread_manager_;
103     }
104 
GetMonitorPool()105     MonitorPool *GetMonitorPool() const override
106     {
107         return monitor_pool_;
108     }
109 
GetGlobalObjectStorage()110     mem::GlobalObjectStorage *GetGlobalObjectStorage() const override
111     {
112         return mm_->GetGlobalObjectStorage();
113     }
114 
GetReferenceProcessor()115     panda::mem::ReferenceProcessor *GetReferenceProcessor() const override
116     {
117         ASSERT(reference_processor_ != nullptr);
118         return reference_processor_;
119     }
120 
121     void DumpForSigQuit(std::ostream &os);
122 
GetPandaVMType()123     PandaVMType GetPandaVMType() const override
124     {
125         return PandaVMType::CORE_VM;
126     }
127 
GetLanguageContext()128     LanguageContext GetLanguageContext() const override
129     {
130         return Runtime::GetCurrent()->GetLanguageContext(panda_file::SourceLang::PANDA_ASSEMBLY);
131     }
132 
GetCompiler()133     CompilerInterface *GetCompiler() const override
134     {
135         return nullptr;
136     }
137 
GetRendezvous()138     Rendezvous *GetRendezvous() const override
139     {
140         return rendezvous_;
141     }
142 
143     ObjectHeader *GetOOMErrorObject() override;
144 
145 protected:
146     bool CheckEntrypointSignature(Method *entrypoint) override;
147     Expected<int, Runtime::Error> InvokeEntrypointImpl(Method *entrypoint,
148                                                        const std::vector<std::string> &args) override;
149     void HandleUncaughtException(ObjectHeader *exception) override;
150 
151 private:
152     explicit PandaCoreVM(Runtime *runtime, const RuntimeOptions &options, mem::MemoryManager *mm);
153 
154     Runtime *runtime_ {nullptr};
155     mem::MemoryManager *mm_ {nullptr};
156     mem::ReferenceProcessor *reference_processor_ {nullptr};
157     PandaVector<ObjectHeader *> gc_roots_;
158     Rendezvous *rendezvous_ {nullptr};
159     CompilerInterface *compiler_ {nullptr};
160     MTManagedThread *main_thread_ {nullptr};
161     StringTable *string_table_ {nullptr};
162     MonitorPool *monitor_pool_ {nullptr};
163     ThreadManager *thread_manager_ {nullptr};
164 
165     NO_MOVE_SEMANTIC(PandaCoreVM);
166     NO_COPY_SEMANTIC(PandaCoreVM);
167 
168     friend class mem::Allocator;
169 };
170 
171 }  // namespace core
172 }  // namespace panda
173 
174 #endif  // PANDA_RUNTIME_CORE_CORE_VM_H_
175