diff --git a/configure b/configure index 7b00460..c5c3160 100755 --- a/configure +++ b/configure @@ -17528,12 +17528,13 @@ fi done -for ac_header in dlfcn.h +for ac_header in dlfcn.h sys/mman.h do : - ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -17603,12 +17604,13 @@ _ACEOF fi done -for ac_func in isatty +for ac_func in isatty mmap munmap do : - ac_fn_c_check_func "$LINENO" "isatty" "ac_cv_func_isatty" -if test "x$ac_cv_func_isatty" = xyes; then : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF -#define HAVE_ISATTY 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi diff --git a/configure.ac b/configure.ac index f549747..ed10354 100644 --- a/configure.ac +++ b/configure.ac @@ -1,9 +1,5 @@ dnl AC_PREREQ([2.67]) -dnl Make sure you change the version information -dnl in include/hcl/conf_*.h whenever you change the version -dnl here. Those files don't depend on autoconf, thus requiring -dnl manual change. AC_INIT([hcl],[0.1.0],[Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)],[],[http://code.abiyo.net/@hcl]) AC_CONFIG_HEADER([lib/hcl-cfg.h]) @@ -121,7 +117,7 @@ dnl check header files. AC_HEADER_STDC AC_CHECK_HEADERS([stddef.h wchar.h wctype.h errno.h signal.h fcntl.h dirent.h]) AC_CHECK_HEADERS([time.h sys/time.h utime.h spawn.h execinfo.h ucontext.h]) -AC_CHECK_HEADERS([dlfcn.h]) +AC_CHECK_HEADERS([dlfcn.h sys/mman.h]) dnl check data types dnl AC_CHECK_TYPE([wchar_t], @@ -137,7 +133,7 @@ AC_CHECK_FUNCS([backtrace backtrace_symbols]) AC_CHECK_FUNCS([makecontext swapcontext getcontext setcontext]) AC_CHECK_FUNCS([clock_nanosleep nanosleep usleep]) AC_CHECK_FUNCS([snprintf _vsnprintf _vsnwprintf]) -AC_CHECK_FUNCS([isatty]) +AC_CHECK_FUNCS([isatty mmap munmap]) save_LIBS="$LIBS" AC_SEARCH_LIBS([dlopen], [dl dld], [DL_LIBS="$ac_cv_search_dlopen"]) diff --git a/lib/hcl-cfg.h.in b/lib/hcl-cfg.h.in index cdcb440..9390fe6 100644 --- a/lib/hcl-cfg.h.in +++ b/lib/hcl-cfg.h.in @@ -93,6 +93,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the `munmap' function. */ +#undef HAVE_MUNMAP + /* Define to 1 if you have the `nanosleep' function. */ #undef HAVE_NANOSLEEP @@ -156,6 +162,9 @@ /* Define to 1 if you have the `swapcontext' function. */ #undef HAVE_SWAPCONTEXT +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MMAN_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H diff --git a/lib/hcl.c b/lib/hcl.c index ce8e81c..7d163e4 100644 --- a/lib/hcl.c +++ b/lib/hcl.c @@ -128,13 +128,6 @@ int hcl_init (hcl_t* hcl, hcl_mmgr_t* mmgr, hcl_oow_t heapsz, const hcl_vmprim_t hcl->log.ptr = (hcl_ooch_t*)hcl_allocmem(hcl, (hcl->log.capa + 1) * HCL_SIZEOF(*hcl->log.ptr)); if (!hcl->log.ptr) goto oops; - /*hcl->permheap = hcl_makeheap (hcl, what is the best size???); - if (!hcl->curheap) goto oops; */ - hcl->curheap = hcl_makeheap(hcl, heapsz); - if (!hcl->curheap) goto oops; - hcl->newheap = hcl_makeheap(hcl, heapsz); - if (!hcl->newheap) goto oops; - if (hcl_rbt_init(&hcl->modtab, hcl, HCL_SIZEOF(hcl_ooch_t), 1) <= -1) goto oops; modtab_inited = 1; hcl_rbt_setstyle(&hcl->modtab, hcl_getrbtstyle(HCL_RBT_STYLE_INLINE_COPIERS)); @@ -149,13 +142,20 @@ int hcl_init (hcl_t* hcl, hcl_mmgr_t* mmgr, hcl_oow_t heapsz, const hcl_vmprim_t hcl->proc_map_free_first = -1; hcl->proc_map_free_last = -1; + /*hcl->permheap = hcl_makeheap (hcl, what is the best size???); + if (!hcl->curheap) goto oops; */ + hcl->curheap = hcl_makeheap(hcl, heapsz); + if (!hcl->curheap) goto oops; + hcl->newheap = hcl_makeheap(hcl, heapsz); + if (!hcl->newheap) goto oops; + return 0; oops: - if (modtab_inited) hcl_rbt_fini (&hcl->modtab); if (hcl->newheap) hcl_killheap (hcl, hcl->newheap); if (hcl->curheap) hcl_killheap (hcl, hcl->curheap); if (hcl->permheap) hcl_killheap (hcl, hcl->permheap); + if (modtab_inited) hcl_rbt_fini (&hcl->modtab); if (hcl->log.ptr) hcl_freemem (hcl, hcl->log.ptr); hcl->log.capa = 0; return -1; diff --git a/lib/main.c b/lib/main.c index 7423850..98cc35e 100644 --- a/lib/main.c +++ b/lib/main.c @@ -83,12 +83,15 @@ # if defined(HAVE_SIGNAL_H) # include # endif +# if defined(HAVE_SYS_MMAN_H) +# include +# endif # include # include # include -# include + #endif #if !defined(HCL_DEFAULT_PFMODPREFIX) @@ -447,47 +450,62 @@ static hcl_ooi_t print_handler (hcl_t* hcl, hcl_iocmd_t cmd, void* arg) static void* alloc_heap (hcl_t* hcl, hcl_oow_t size) { - /* It's called when HCL creates a GC heap. +#if defined(HAVE_MMAP) && defined(HAVE_MUNMAP) + /* It's called via hcl_makeheap() when HCL creates a GC heap. * The heap is large in size. I can use a different memory allocation - * function instead of an ordinary malloc */ + * function instead of an ordinary malloc. + * upon failure, it doesn't require to set error information as hcl_makeheap() + * set the error number to HCL_EOOMEM. */ + +#if !defined(MAP_HUGETLB) && (defined(__amd64__) || defined(__x86_64__)) +# define MAP_HUGETLB 0x40000 +#endif + hcl_oow_t* ptr; int flags; hcl_oow_t actual_size; flags = MAP_PRIVATE | MAP_ANONYMOUS; -#if defined(MAP_HUGETLB) - flags |= MAP_HUGETLB; -#endif -#if defined(MAP_UNINITIALIZED) - flags |= MAP_UNINITIALIZED; -#endif - + #if defined(MAP_HUGETLB) + flags |= MAP_HUGETLB; + #endif + + #if defined(MAP_UNINITIALIZED) + flags |= MAP_UNINITIALIZED; + #endif + actual_size = HCL_SIZEOF(hcl_oow_t) + size; actual_size = HCL_ALIGN_POW2(actual_size, 2 * 1024 * 1024); ptr = (hcl_oow_t*)mmap(NULL, actual_size, PROT_READ | PROT_WRITE, flags, -1, 0); if (ptr == MAP_FAILED) { -#if defined(MAP_HUGETLB) + #if defined(MAP_HUGETLB) flags &= ~MAP_HUGETLB; ptr = (hcl_oow_t*)mmap(NULL, actual_size, PROT_READ | PROT_WRITE, flags, -1, 0); if (ptr == MAP_FAILED) return HCL_NULL; -#else + #else return HCL_NULL; -#endif + #endif } *ptr = actual_size; return (void*)(ptr + 1); - /*return HCL_MMGR_ALLOC(hcl->mmgr, size);*/ + +#else + return HCL_MMGR_ALLOC(hcl->mmgr, size); +#endif } static void free_heap (hcl_t* hcl, void* ptr) { +#if defined(HAVE_MMAP) && defined(HAVE_MUNMAP) hcl_oow_t* actual_ptr; actual_ptr = (hcl_oow_t*)ptr - 1; munmap (actual_ptr, *actual_ptr); - /*return HCL_MMGR_FREE(hcl->mmgr, ptr);*/ +#else + return HCL_MMGR_FREE(hcl->mmgr, ptr); +#endif } static int write_all (int fd, const char* ptr, hcl_oow_t len)