APR_DECLARE(apr_status_t) port_vmem_reserve(port_vmem_t **block, void **address, size_t amount, unsigned int mode, size_t pageSize, apr_pool_t *pool){ void *start = 0; DWORD action = MEM_RESERVE; DWORD protection = PAGE_NOACCESS; int large = 0; size_t* ps = port_vmem_page_sizes(); if ((pageSize == PORT_VMEM_PAGESIZE_LARGE && ps[1] != 0) || pageSize > ps[0]) { /* Using large pages on Win64 seems to require MEM_COMMIT and PAGE_READWRITE.*/ action = MEM_COMMIT | MEM_LARGE_PAGES; protection = PAGE_READWRITE; large = 1; } start = VirtualAlloc(*address, amount, action, protection); if (!start) { return apr_get_os_error(); } *block = apr_palloc(pool, sizeof(port_vmem_t)); (*block)->pool = pool; (*block)->start = start; (*block)->size = amount; (*block)->protection = convertProtectionMask(mode); (*block)->large = large; *address = start; return APR_SUCCESS; }
BasePoolManager::BasePoolManager(size_t initial_size, bool use_large_pages, bool is_code) : _use_large_pages(use_large_pages), _default_pool_size(initial_size), _is_code(is_code) { size_t* ps = port_vmem_page_sizes(); _page_size = ps[0]; if (_use_large_pages && ps[1] != 0) _page_size = ps[1]; VERIFY_SUCCESS(apr_pool_create(&aux_pool, 0)); VERIFY_SUCCESS(apr_thread_mutex_create(&aux_mutex, APR_THREAD_MUTEX_NESTED, aux_pool)); #ifdef VM_STATS VM_Statistics::get_vm_stats().number_memorymanager_created++; #endif }
APR_DECLARE(apr_status_t) port_vmem_reserve(port_vmem_t **block, void **address, size_t size, unsigned int mode, size_t page, apr_pool_t *pool) { void *start = 0; if (PORT_VMEM_PAGESIZE_DEFAULT == page || PORT_VMEM_PAGESIZE_LARGE == page) { page = port_vmem_page_sizes()[0]; } int protection = convertProtectionBits(mode); errno = 0; size = (size + page - 1) & ~(page - 1); /* Align */ #ifdef MAP_ANONYMOUS start = mmap(*address, size, protection, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); #elif defined(MAP_ANON) start = mmap(*address, size, protection, MAP_PRIVATE | MAP_ANON, -1, 0); #else int fd = open("/dev/zero", O_RDONLY); start = mmap(*address, size, protection, MAP_PRIVATE, fd, 0); close(fd); #endif if (MAP_FAILED == start) { return apr_get_os_error(); } *block = apr_palloc(pool, sizeof(port_vmem_t)); (*block)->pool = pool; (*block)->start = start; (*block)->size = size; (*block)->page = page; (*block)->protection = protection; *address = start; return APR_SUCCESS; }
APR_DECLARE(size_t) port_vmem_committed_size(){ char* buf = (char*) malloc(PATH_MAX + 1); size_t vmem = 0; pid_t my_pid = getpid(); sprintf(buf, "/proc/%d/statm", my_pid); FILE* file = fopen(buf, "r"); if (!file) { goto cleanup; } size_t size = 0; ssize_t len = getline(&buf, &size, file); fclose(file); if (len == -1) { goto cleanup; } sscanf(buf, "%lu", &vmem); cleanup: free(buf); return vmem * port_vmem_page_sizes()[0]; }
Global_Env::Global_Env(apr_pool_t * pool, size_t string_pool_size): mem_pool(pool), bootstrap_class_loader(NULL), system_class_loader(NULL), TI(NULL), nsoTable(NULL), portLib(NULL), dcList(NULL), assert_reg(NULL), string_pool(string_pool_size), total_loaded_class_count(0), unloaded_class_count(0), total_compilation_time(0), bootstrapping(false), ready_for_exceptions(false) { // TODO: Use proper MM. m_java_properties = new Properties(); m_vm_properties = new Properties(); bootstrap_class_loader = new BootstrapClassLoader(this); hythread_lib_create(&hythread_lib); #if defined _IPF_ || defined _EM64T_ compact_fields = true; sort_fields = true; #else // !_IPF_ compact_fields = false; sort_fields = false; #endif // !IPF_ heap_base = heap_end = managed_null = NULL; JavaLangString_String = string_pool.lookup("java/lang/String"); JavaLangStringBuffer_String = string_pool.lookup("java/lang/StringBuffer"); JavaLangObject_String = string_pool.lookup("java/lang/Object"); JavaLangClass_String = string_pool.lookup("java/lang/Class"); VoidVoidDescriptor_String = string_pool.lookup("()V"); VoidBooleanDescriptor_String = string_pool.lookup("()Z"); VoidIntegerDescriptor_String = string_pool.lookup("()I"); JavaLangThrowable_String = string_pool.lookup("java/lang/Throwable"); JavaLangNoClassDefFoundError_String = string_pool.lookup("java/lang/NoClassDefFoundError"); JavaLangArrayIndexOutOfBoundsException_String = string_pool.lookup("java/lang/ArrayIndexOutOfBoundsException"); JavaNioByteBuffer_String = string_pool.lookup("java/nio/ByteBuffer"); JavaLangIllegalArgumentException_String = string_pool.lookup("java/lang/IllegalArgumentException"); JavaLangReflectField_String = string_pool.lookup("java/lang/reflect/Field"); JavaLangReflectConstructor_String = string_pool.lookup("java/lang/reflect/Constructor"); JavaLangReflectMethod_String = string_pool.lookup("java/lang/reflect/Method"); JavaLangUnsatisfiedLinkError_String = string_pool.lookup("java/lang/UnsatisfiedLinkError"); JavaLangNullPointerException_String = string_pool.lookup("java/lang/NullPointerException"); Init_String = string_pool.lookup("<init>"); Clinit_String = string_pool.lookup("<clinit>"); FinalizeName_String = string_pool.lookup("finalize"); EnqueueName_String = string_pool.lookup("enqueue"); Clonable_String = string_pool.lookup("java/lang/Cloneable"); Serializable_String = string_pool.lookup("java/io/Serializable"); Detach_String = string_pool.lookup("detach"); DetachDescriptor_String = string_pool.lookup("(Ljava/lang/Throwable;)V"); GetUncaughtExceptionHandler_String = string_pool.lookup("getUncaughtExceptionHandler"); GetUncaughtExceptionHandlerDescriptor_String = string_pool.lookup("()Ljava/lang/Thread$UncaughtExceptionHandler;"); UncaughtException_String = string_pool.lookup("uncaughtException"); UncaughtExceptionDescriptor_String = string_pool.lookup("(Ljava/lang/Thread;Ljava/lang/Throwable;)V"); GetDefaultUncaughtExceptionHandler_String = string_pool.lookup("getDefaultUncaughtExceptionHandler"); GetDefaultUncaughtExceptionHandlerDescriptor_String = string_pool.lookup("()Ljava/lang/Thread$UncaughtExceptionHandler;"); GetName_String = string_pool.lookup("getName"); GetNameDescriptor_String = string_pool.lookup("()Ljava/lang/String;"); Remove_String = string_pool.lookup("remove"); RemoveDescriptor_String = string_pool.lookup("(Ljava/lang/Thread;)V"); LLRemove_String = string_pool.lookup("remove"); LLRemoveDescriptor_String = string_pool.lookup("(Ljava/lang/Object;)Z"); Length_String = string_pool.lookup("length"); LoadClass_String = string_pool.lookup("loadClass"); InitCause_String = string_pool.lookup("initCause"); FromStringConstructorDescriptor_String = string_pool.lookup("(Ljava/lang/String;)V"); LoadClassDescriptor_String = string_pool.lookup("(Ljava/lang/String;)Ljava/lang/Class;"); InitCauseDescriptor_String = string_pool.lookup("(Ljava/lang/Throwable;)Ljava/lang/Throwable;"); // // globals // // HT support from command line disabled. VM should automatically detect HT status at startup. is_hyperthreading_enabled = false; use_lil_stubs = true; #ifdef REFS_USE_RUNTIME_SWITCH #ifdef POINTER64 compress_references = true; #else // POINTER64 compress_references = false; #endif // POINTER64 #endif // REFS_USE_RUNTIME_SWITCH strings_are_compressed = false; // page size detection use_large_pages = false; size_t *ps = port_vmem_page_sizes(); if (ps[1] != 0 && use_large_pages) { system_page_size = ps[1]; } else { system_page_size = ps[0]; } verify_all = false; verify_strict = false; verify = true; pin_interned_strings = false; retain_invisible_annotations = false; // initialize critical sections p_jit_a_method_lock = new Lock_Manager(); p_vtable_patch_lock = new Lock_Manager(); p_handle_lock = new Lock_Manager(); p_method_call_lock = new Lock_Manager(); p_dclist_lock = new Lock_Manager(); p_suspend_lock = new Lock_Manager(); // // preloaded classes // Boolean_Class = NULL; Char_Class = NULL; Float_Class = NULL; Double_Class = NULL; Byte_Class = NULL; Short_Class = NULL; Int_Class = NULL; Long_Class = NULL; ArrayOfBoolean_Class = NULL; ArrayOfChar_Class = NULL; ArrayOfFloat_Class = NULL; ArrayOfDouble_Class = NULL; ArrayOfByte_Class = NULL; ArrayOfShort_Class = NULL; ArrayOfInt_Class = NULL; ArrayOfLong_Class = NULL; JavaLangObject_Class = NULL; JavaLangString_Class = NULL; JavaLangClass_Class = NULL; java_lang_Throwable_Class = NULL; java_lang_Error_Class = NULL; java_lang_ExceptionInInitializerError_Class = NULL; java_lang_NullPointerException_Class = NULL; java_lang_StackOverflowError_Class = NULL; java_lang_ArrayIndexOutOfBoundsException_Class = NULL; java_lang_ArrayStoreException_Class = NULL; java_lang_ArithmeticException_Class = NULL; java_lang_ClassCastException_Class = NULL; java_lang_OutOfMemoryError_Class = NULL; java_lang_InternalError_Class = NULL; java_lang_ThreadDeath_Class = NULL; java_lang_OutOfMemoryError = NULL; popFrameException = NULL; java_lang_FinalizerThread_Class = NULL; java_io_Serializable_Class = NULL; java_lang_Cloneable_Class = NULL; java_lang_Thread_Class = NULL; java_lang_ThreadGroup_Class = NULL; java_lang_reflect_Constructor_Class = NULL; java_lang_reflect_Field_Class = NULL; java_lang_reflect_Method_Class = NULL; JavaLangString_VTable = NULL; java_security_ProtectionDomain_Class = NULL; Class_domain_field_offset = 0; vm_class_offset = 0; vm_state = VM_INITIALIZING; TI = new DebugUtilsTI; NCAI = new GlobalNCAI; nsoTable = nso_init_lookup_table(&string_pool); } //Global_Env::Global_Env