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