vm/vmcore/include/environment.h (230 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _ENVIRONMENT_H #define _ENVIRONMENT_H #include <apr_pools.h> #include <apr_thread_mutex.h> #include <apr_time.h> #include "open/hythread.h" #include "open/compmgr.h" #include "open/em_vm.h" #include "mem_alloc.h" #include "String_Pool.h" #include "vm_core_types.h" #include "object_handles.h" #include "jvmti_internal.h" #include "ncai_internal.h" typedef struct NSOTableItem NSOTableItem; typedef struct DynamicCode DynamicCode; typedef struct Assertion_Registry Assertion_Registry; #ifdef USE_COMPRESSED_VTABLE_POINTERS typedef VirtualMemoryPool VTablePool; // used for compressed VTable pointers #define DEFAULT_VTABLE_POOL_SIZE 1*GBYTE #else //USE_COMPRESSED_VTABLE_POINTERS typedef PoolManager VTablePool; // used for uncompressed VTable pointers #define DEFAULT_VTABLE_POOL_SIZE 256*KBYTE #endif //USE_COMPRESSED_VTABLE_POINTERS struct Global_Env { public: // Global VM states. enum VM_STATE { VM_INITIALIZING, VM_RUNNING, VM_SHUTDOWNING }; apr_pool_t* mem_pool; // memory pool BootstrapClassLoader* bootstrap_class_loader; UserDefinedClassLoader* system_class_loader; size_t bootstrap_code_pool_size; size_t user_code_pool_size; DebugUtilsTI* TI; GlobalNCAI* NCAI; NSOTableItem* nsoTable; void* portLib; // Classlib's port library DynamicCode* dcList; Assertion_Registry* assert_reg; PoolManager* GlobalCodeMemoryManager; VTablePool* VTableMemoryManager; hythread_library_t hythread_lib; String_Pool string_pool; // string table JavaVMInitArgs vm_arguments; /** * Globals */ bool is_hyperthreading_enabled; // VM automatically detects HT status at startup. bool use_lil_stubs; // 20030307: Use LIL stubs instead of hand crafted ones. Default off (IPF) on (IA32). #ifdef REFS_USE_RUNTIME_SWITCH bool compress_references; // 20030311 Compress references in references and vector elements. #endif bool strings_are_compressed; // 2003-05-19: The VM searches the java.lang.String class for a "byte[] bvalue" field at startup, // as an indication that the Java class library supports compressed strings with 8-bit characters. bool use_large_pages; // 20040109 Use large pages for class-related data such as vtables. bool pin_interned_strings; // if true, interned strings are never moved bool retain_invisible_annotations; // retain InvisibleAnnotation and InvisibleParameterAnnotation bool verify_all; // Verify all classes including loaded by bootstrap class loader bool verify_strict; // Do strict verification bool verify; // Verify if -Xverify:none or -noverify flags aren't set size_t system_page_size; // system page size according to use_large_pages value Lock_Manager *p_jit_a_method_lock; Lock_Manager *p_vtable_patch_lock; Lock_Manager *p_method_call_lock; Lock_Manager *p_handle_lock; Lock_Manager *p_dclist_lock; Lock_Manager *p_suspend_lock; /** * If set to true, DLRVM will store JARs which are adjacent in boot class path * into single jar entry cache. This will optimize lookups on class loading * with bootstrap class loader. */ bool use_common_jar_cache; /** * If set to true, jar files are mapped into memory instead of reading * them from disk. */ bool map_bootsrtap_jars; /** * If set to true by the <code>-compact_fields</code> command-line option, * the VM will not pad out fields of less than 32 bits to four bytes. * However, fields will still be aligned to a natural boundary, * and the <code>num_field_padding_bytes</code> field will reflect those * alignment padding bytes. */ bool compact_fields; /** * If set to true by the <code>-sort_fields</code> command line option, * the VM will sort fields by size before assigning their offset during * class preparation. */ bool sort_fields; /* * Base address of Java heap. */ U_8* heap_base; /** * Ceiling of Java heap. */ /** * @note We assume Java heap uses one continuous memory block. */ U_8* heap_end; /** * This will be set to either <code>NULL</code> or <code>heap_base</code> depending * on whether compressed references are used. */ U_8* managed_null; /** * Preloaded strings */ String* JavaLangObject_String; String* JavaLangClass_String; String* Init_String; String* Clinit_String; String* FinalizeName_String; String* EnqueueName_String; String* VoidVoidDescriptor_String; String* VoidIntegerDescriptor_String; String* VoidBooleanDescriptor_String; String* Clonable_String; String* Serializable_String; String* Detach_String; String* DetachDescriptor_String; String* GetUncaughtExceptionHandler_String; String* GetUncaughtExceptionHandlerDescriptor_String; String* UncaughtException_String; String* UncaughtExceptionDescriptor_String; String* GetDefaultUncaughtExceptionHandler_String; String* GetDefaultUncaughtExceptionHandlerDescriptor_String; String* GetName_String; String* GetNameDescriptor_String; String* Remove_String; String* RemoveDescriptor_String; String* LLRemove_String; String* LLRemoveDescriptor_String; String* JavaLangReflectMethod_String; String* JavaLangNullPointerException_String; String* JavaLangUnsatisfiedLinkError_String; String* JavaLangReflectConstructor_String; String* JavaLangReflectField_String; String* JavaLangIllegalArgumentException_String; String* JavaNioByteBuffer_String; String* JavaLangArrayIndexOutOfBoundsException_String; String* JavaLangThrowable_String; String* JavaLangNoClassDefFoundError_String; String* JavaLangString_String; String* JavaLangStringBuffer_String; String* Length_String; String* LoadClass_String; String* InitCause_String; String* FromStringConstructorDescriptor_String; String* LoadClassDescriptor_String; String* InitCauseDescriptor_String; /** * Preloaded methods */ Method* VM_intern; /** * Preloaded classes */ Class* Boolean_Class; Class* Char_Class; Class* Float_Class; Class* Double_Class; Class* Byte_Class; Class* Short_Class; Class* Int_Class; Class* Long_Class; Class* Void_Class; Class* ArrayOfBoolean_Class; Class* ArrayOfChar_Class; Class* ArrayOfFloat_Class; Class* ArrayOfDouble_Class; Class* ArrayOfByte_Class; Class* ArrayOfShort_Class; Class* ArrayOfInt_Class; Class* ArrayOfLong_Class; Class* JavaLangObject_Class; Class* JavaLangString_Class; Class* JavaLangClass_Class; Class* java_lang_Throwable_Class; Class* java_lang_StackTraceElement_Class; Class* java_lang_Error_Class; Class* java_lang_ExceptionInInitializerError_Class; Class* java_lang_NullPointerException_Class; Class* java_lang_StackOverflowError_Class; Class* java_lang_ClassNotFoundException_Class; Class* java_lang_NoClassDefFoundError_Class; Class* java_lang_ArrayIndexOutOfBoundsException_Class; Class* java_lang_ArrayStoreException_Class; Class* java_lang_ArithmeticException_Class; Class* java_lang_ClassCastException_Class; Class* java_lang_OutOfMemoryError_Class; Class* java_lang_InternalError_Class; Class* java_lang_ThreadDeath_Class; Class* java_security_ProtectionDomain_Class; unsigned Class_domain_field_offset; ObjectHandle java_lang_Object; ObjectHandle java_lang_OutOfMemoryError; ObjectHandle java_lang_ThreadDeath; /** * Object of <code>java.lang.Error</code> class used for * JVMTI JIT PopFrame support. */ ObjectHandle popFrameException; Class* java_io_Serializable_Class; Class* java_lang_Cloneable_Class; Class* java_lang_Thread_Class; Class* java_lang_ThreadGroup_Class; Class* java_util_LinkedList_Class; Class* java_util_Date_Class; Class* java_util_Properties_Class; Class* java_lang_Runtime_Class; Class* java_lang_reflect_Constructor_Class; Class* java_lang_reflect_Field_Class; Class* java_lang_reflect_Method_Class; Class* java_lang_FinalizerThread_Class; Class* java_lang_EMThreadSupport_Class; /** * VTable for the <code>java_lang_String</code> class */ VTable* JavaLangString_VTable; /** * Offset to the <code>vm_class</code> field in <code>java.lang.Class</code>. */ unsigned vm_class_offset; /** * VM initialization timestamp */ apr_time_t start_time; /** * Total method compilation time in msec */ apr_time_t total_compilation_time; /** * Total loaded class count */ unsigned total_loaded_class_count; /** * Total unloaded class count */ unsigned unloaded_class_count; /** * The initial amount of Java heap memory (bytes) */ size_t init_gc_used_memory; /** * The initial amount of used memory (bytes) */ size_t init_used_memory; /** * The VM state. See <code>VM_STATE</code> enum above. */ volatile int vm_state; /** * FIXME * The whole environemt will be refactored to VM instance. * The following contains a cached copy of EM interface table. */ OpenComponentManagerHandle cm; OpenComponentHandle em_component; OpenInstanceHandle em_instance; OpenEmVmHandle em_interface; Global_Env(apr_pool_t *pool, size_t string_pool_size); ~Global_Env(); void * operator new(size_t size, apr_pool_t * pool) { return apr_palloc(pool, sizeof(Global_Env)); } void operator delete(void *) {} void operator delete(void * mem, apr_pool_t * pool) {}; /** * Determine bootstrapping of root classes */ bool InBootstrap() const { return bootstrapping; } void StartVMBootstrap() { assert(!bootstrapping); bootstrapping = true; } void FinishVMBootstrap() { assert(bootstrapping); bootstrapping = false; } int isVmInitializing() { return vm_state == VM_INITIALIZING; } int isVmRunning() { return vm_state == VM_RUNNING; } int IsVmShutdowning() { return vm_state == VM_SHUTDOWNING; } /** * Load a class via bootstrap classloader. */ Class* LoadCoreClass(const String* name); Class* LoadCoreClass(const char* name); /** * Set <code>Ready For Exceptions</code> state. * This function must be called as, soon as VM becomes able to create * exception objects. I.e. all required classes (such as </code>java/lang/Trowable</code>) * are loaded. */ void ReadyForExceptions() { ready_for_exceptions = true; } /** * Get <code>Ready For Exceptions</code> state. * * @return <code>TRUE</code>, if VM is able to create exception objects. */ bool IsReadyForExceptions() const { return ready_for_exceptions; } Properties* JavaProperties() { return m_java_properties; } Properties* VmProperties() { return m_vm_properties; } void init_pools(); private: bool bootstrapping; bool ready_for_exceptions; Properties* m_java_properties; Properties* m_vm_properties; }; /** * Parses a size string, e. g. <num>, <num>k, <num>m. * @return size in bytes, or 0 if parsing failed */ size_t parse_size(const char* value); #endif // _ENVIRONMENT_H