예제 #1
0
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;
}
예제 #2
0
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
}
예제 #3
0
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;
}
예제 #4
0
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];
}
예제 #5
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