diff options
Diffstat (limited to 'java/openjdk6/files/patch-set')
-rw-r--r-- | java/openjdk6/files/patch-set | 593 |
1 files changed, 452 insertions, 141 deletions
diff --git a/java/openjdk6/files/patch-set b/java/openjdk6/files/patch-set index 960b5c4eeb2f..d64c58204f17 100644 --- a/java/openjdk6/files/patch-set +++ b/java/openjdk6/files/patch-set @@ -4140,7 +4140,7 @@ # include <signal.h> # include <errno.h> # include <dlfcn.h> -@@ -102,21 +101,51 @@ +@@ -102,21 +101,57 @@ # include <sys/utsname.h> # include <sys/socket.h> # include <sys/wait.h> @@ -4166,6 +4166,12 @@ # include <sys/ioctl.h> +#ifdef __FreeBSD__ ++#if __FreeBSD_version > 700109 ++#include <bitset> ++#include <sys/cpuset.h> ++#endif ++#include <vm/swap_pager.h> ++#include <vm/vm_param.h> +#if __FreeBSD_version > 900030 +#include <pthread_np.h> +#else @@ -4193,7 +4199,7 @@ #define MAX_PATH (2 * K) // for timer info max values which include all bits -@@ -127,19 +156,25 @@ +@@ -127,19 +162,25 @@ // global variables julong os::Bsd::_physical_memory = 0; @@ -4219,7 +4225,7 @@ static jlong initial_time_count=0; -@@ -157,8 +192,6 @@ +@@ -157,8 +198,6 @@ static int SR_signum = SIGUSR2; sigset_t SR_sigset; @@ -4228,11 +4234,33 @@ //////////////////////////////////////////////////////////////////////////////// // utility functions -@@ -171,11 +204,16 @@ +@@ -171,11 +210,38 @@ } julong os::Bsd::available_memory() { +#ifdef _ALLBSD_SOURCE ++#ifdef __FreeBSD__ ++ static const char *vm_stats[] = { ++ "vm.stats.vm.v_free_count", ++ "vm.stats.vm.v_cache_count", ++ /* "vm.stats.vm.v_inactive_count", */ ++ NULL ++ }; ++ size_t size; ++ julong free_pages; ++ u_int i, npages; ++ ++ for (i = 0, free_pages = 0, size = sizeof(npages); vm_stats[i] != NULL; i++) { ++ if (sysctlbyname(vm_stats[i], &npages, &size, NULL, 0) == -1) { ++ free_pages = 0; ++ break; ++ } ++ free_pages += npages; ++ } ++ if (free_pages > 0) ++ free_pages *= os::vm_page_size(); ++ else ++#endif + // XXXBSD: this is just a stopgap implementation + return physical_memory() >> 2; +#else @@ -4245,7 +4273,7 @@ } julong os::physical_memory() { -@@ -223,6 +261,7 @@ +@@ -223,6 +289,7 @@ } @@ -4253,7 +4281,7 @@ #ifndef SYS_gettid // i386: 224, ia64: 1105, amd64: 186, sparc 143 #ifdef __ia64__ -@@ -237,6 +276,7 @@ +@@ -237,6 +304,7 @@ #error define gettid for the arch #endif #endif @@ -4261,7 +4289,7 @@ // Cpu architecture string #if defined(ZERO) -@@ -267,28 +307,58 @@ +@@ -267,28 +335,86 @@ // Returns the kernel thread id of the currently running thread. Kernel // thread id is used to access /proc. // @@ -4284,18 +4312,38 @@ + thr_self(&tid); + return (pid_t)tid; +#endif - } ++} +#endif - --// Most versions of bsd have a bug where the number of processors are --// determined by looking at the /proc file system. In a chroot environment, --// the system call returns 1. This causes the VM to act as if it is --// a single processor and elide locking (see is_MP() call). --static bool unsafe_chroot_detected = false; --static const char *unstable_chroot_error = "/proc file system not found.\n" -- "Java may be unstable running multithreaded in a chroot " -- "environment on Bsd when /proc filesystem is not mounted."; -+#ifdef _ALLBSD_SOURCE ++ ++#if defined(__FreeBSD__) ++void os::Bsd::initialize_system_info() { ++ int cpu_val = sysconf(_SC_NPROCESSORS_CONF); ++ if (cpu_val >= 1) ++ set_processor_count(cpu_val); ++ else ++ set_processor_count(1); // fallback ++ ++#ifdef _SC_PHYS_PAGES ++ long phys_pages = sysconf(_SC_PHYS_PAGES); ++ if (phys_pages > 0) ++ _physical_memory = (julong)phys_pages * _page_size; ++ else ++ _physical_memory = 256*1024*1024; // fallback (XXXBSD?) ++#else ++ int mib[2]; ++ size_t len; ++ u_long mem_val; ++ ++ mib[0] = CTL_HW; ++ mib[1] = HW_PHYSMEM; ++ len = sizeof(mem_val); ++ if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1) ++ _physical_memory = mem_val; ++ else ++ _physical_memory = 256*1024*1024; // fallback (XXXBSD?) ++#endif + } ++#elif defined(_ALLBSD_SOURCE) +void os::Bsd::initialize_system_info() { + int mib[2]; + size_t len; @@ -4313,6 +4361,14 @@ + set_processor_count(1); // fallback + } +-// Most versions of bsd have a bug where the number of processors are +-// determined by looking at the /proc file system. In a chroot environment, +-// the system call returns 1. This causes the VM to act as if it is +-// a single processor and elide locking (see is_MP() call). +-static bool unsafe_chroot_detected = false; +-static const char *unstable_chroot_error = "/proc file system not found.\n" +- "Java may be unstable running multithreaded in a chroot " +- "environment on Bsd when /proc filesystem is not mounted."; + /* get physical memory via hw.usermem sysctl (hw.usermem is used + * instead of hw.physmem because we need size of allocatable memory + */ @@ -4323,7 +4379,7 @@ + _physical_memory = mem_val; + else + _physical_memory = 256*1024*1024; // fallback (XXXBSD?) -+ + +#ifdef __OpenBSD__ + { + // limit _physical_memory memory view on OpenBSD since @@ -4338,7 +4394,7 @@ void os::Bsd::initialize_system_info() { set_processor_count(sysconf(_SC_NPROCESSORS_CONF)); if (processor_count() == 1) { -@@ -305,6 +375,7 @@ +@@ -305,6 +431,7 @@ _physical_memory = (julong)sysconf(_SC_PHYS_PAGES) * (julong)sysconf(_SC_PAGESIZE); assert(processor_count() > 0, "bsd error"); } @@ -4346,7 +4402,7 @@ void os::init_system_properties_values() { // char arch[12]; -@@ -348,9 +419,7 @@ +@@ -348,9 +475,7 @@ * ... * 7: The default directories, normally /lib and /usr/lib. */ @@ -4357,7 +4413,7 @@ #define DEFAULT_LIBPATH "/lib:/usr/lib" #endif -@@ -429,7 +498,11 @@ +@@ -429,7 +554,11 @@ * should always exist (until the legacy problem cited above is * addressed). */ @@ -4369,7 +4425,7 @@ if (v != NULL) { char *t = ld_library_path; /* That's +1 for the colon and +1 for the trailing '\0' */ -@@ -588,6 +661,7 @@ +@@ -588,6 +717,7 @@ } } @@ -4377,7 +4433,7 @@ ////////////////////////////////////////////////////////////////////////////// // detecting pthread library -@@ -751,6 +825,7 @@ +@@ -751,6 +881,7 @@ } return false; } @@ -4385,7 +4441,7 @@ ////////////////////////////////////////////////////////////////////////////// // create new thread -@@ -759,6 +834,9 @@ +@@ -759,6 +890,9 @@ // check if it's safe to start a new thread static bool _thread_safety_check(Thread* thread) { @@ -4395,7 +4451,7 @@ if (os::Bsd::is_BsdThreads() && !os::Bsd::is_floating_stack()) { // Fixed stack BsdThreads (SuSE Bsd/x86, and some versions of Redhat) // Heap is mmap'ed at lower end of memory space. Thread stacks are -@@ -792,6 +870,7 @@ +@@ -792,6 +926,7 @@ // here, that means enough space has been reserved for stack. return true; } @@ -4403,7 +4459,7 @@ } // Thread start routine for all newly created threads -@@ -819,15 +898,22 @@ +@@ -819,15 +954,22 @@ return NULL; } @@ -4426,7 +4482,7 @@ // initialize signal mask for this thread os::Bsd::hotspot_sigmask(thread); -@@ -910,17 +996,22 @@ +@@ -910,17 +1052,22 @@ // let pthread_create() pick the default value. } @@ -4449,7 +4505,7 @@ pthread_t tid; int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread); -@@ -934,7 +1025,9 @@ +@@ -934,7 +1081,9 @@ // Need to clean up stuff we've allocated so far thread->set_osthread(NULL); delete osthread; @@ -4459,7 +4515,7 @@ return false; } -@@ -950,9 +1043,11 @@ +@@ -950,9 +1099,11 @@ } } @@ -4471,7 +4527,7 @@ } // Aborted due to thread limit being reached -@@ -990,7 +1085,11 @@ +@@ -990,7 +1141,11 @@ } // Store pthread info into the OSThread @@ -4483,7 +4539,7 @@ osthread->set_pthread_id(::pthread_self()); // initialize floating point control register -@@ -1001,6 +1100,7 @@ +@@ -1001,6 +1156,7 @@ thread->set_osthread(osthread); @@ -4491,7 +4547,7 @@ if (UseNUMA) { int lgrp_id = os::numa_get_group_id(); if (lgrp_id != -1) { -@@ -1027,6 +1127,7 @@ +@@ -1027,6 +1183,7 @@ os::Bsd::manually_expand_stack(jt, addr); osthread->clear_expanding_stack(); } @@ -4499,7 +4555,7 @@ // initialize signal mask for this thread // and save the caller's signal mask -@@ -1085,6 +1186,7 @@ +@@ -1085,6 +1242,7 @@ ////////////////////////////////////////////////////////////////////////////// // initial thread @@ -4507,7 +4563,7 @@ // Check if current thread is the initial thread, similar to Solaris thr_main. bool os::Bsd::is_initial_thread(void) { char dummy; -@@ -1321,6 +1423,7 @@ +@@ -1321,6 +1479,7 @@ _initial_thread_stack_size = align_size_down(_initial_thread_stack_size, page_size()); _initial_thread_stack_bottom = (address)stack_top - _initial_thread_stack_size; } @@ -4515,7 +4571,7 @@ //////////////////////////////////////////////////////////////////////////////// // time support -@@ -1342,9 +1445,7 @@ +@@ -1342,9 +1501,7 @@ return (1000 * 1000); } @@ -4526,7 +4582,7 @@ bool os::supports_vtime() { return false; } bool os::enable_vtime() { return false; } bool os::vtime_enabled() { return false; } -@@ -1364,6 +1465,21 @@ +@@ -1364,6 +1521,21 @@ #define CLOCK_MONOTONIC (1) #endif @@ -4548,7 +4604,7 @@ void os::Bsd::clock_init() { // we do dlopen's in this particular order due to bug in bsd // dynamical loader (see 6348968) leading to crash on exit -@@ -1399,7 +1515,9 @@ +@@ -1399,7 +1571,9 @@ } } } @@ -4558,7 +4614,7 @@ #ifndef SYS_clock_getres #if defined(IA32) || defined(AMD64) -@@ -1440,6 +1558,7 @@ +@@ -1440,6 +1614,7 @@ _pthread_getcpuclockid = pthread_getcpuclockid_func; } } @@ -4566,7 +4622,7 @@ jlong os::javaTimeNanos() { if (Bsd::supports_monotonic_clock()) { -@@ -1608,7 +1727,14 @@ +@@ -1608,7 +1783,14 @@ // DLL functions @@ -4582,7 +4638,7 @@ // This must be hard coded because it's the system's temporary // directory not the java application's temp directory, ala java.io.tmpdir. -@@ -1628,13 +1754,13 @@ +@@ -1628,13 +1810,13 @@ const size_t pnamelen = pname ? strlen(pname) : 0; // Quietly truncate on buffer overflow. Should be an error. @@ -4598,7 +4654,7 @@ } else if (strchr(pname, *os::path_separator()) != NULL) { int n; char** pelements = split_path(pname, &n); -@@ -1643,7 +1769,8 @@ +@@ -1643,7 +1825,8 @@ if (pelements[i] == NULL || strlen(pelements[i]) == 0) { continue; // skip the empty path values } @@ -4608,7 +4664,7 @@ if (file_exists(buffer)) { break; } -@@ -1658,7 +1785,7 @@ +@@ -1658,7 +1841,7 @@ FREE_C_HEAP_ARRAY(char*, pelements); } } else { @@ -4617,7 +4673,7 @@ } } -@@ -1708,6 +1835,23 @@ +@@ -1708,6 +1891,23 @@ return false; } @@ -4641,7 +4697,7 @@ struct _address_to_library_name { address addr; // input : memory address size_t buflen; // size of fname -@@ -1782,11 +1926,27 @@ +@@ -1782,11 +1982,27 @@ return false; } } @@ -4658,18 +4714,18 @@ + // Successful loading + return result; + } - ++ + // Read system error message into ebuf + ::strncpy(ebuf, ::dlerror(), ebuflen-1); + ebuf[ebuflen-1]='\0'; -+ + + return NULL; +} +#else void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { void * result= ::dlopen(filename, RTLD_LAZY); -@@ -1839,6 +1999,26 @@ +@@ -1839,6 +2055,26 @@ #define EM_486 6 /* Intel 80486 */ #endif @@ -4696,7 +4752,7 @@ static const arch_t arch_array[]={ {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, -@@ -1942,17 +2122,11 @@ +@@ -1942,17 +2178,11 @@ return NULL; } @@ -4717,7 +4773,7 @@ } -@@ -1975,7 +2149,51 @@ +@@ -1975,7 +2205,51 @@ void os::print_dll_info(outputStream *st) { st->print_cr("Dynamic libraries:"); @@ -4770,7 +4826,7 @@ char fname[32]; pid_t pid = os::Bsd::gettid(); -@@ -1984,6 +2202,7 @@ +@@ -1984,6 +2258,7 @@ if (!_print_ascii_file(fname, st)) { st->print("Can not get library information for pid = %d\n", pid); } @@ -4778,7 +4834,7 @@ } -@@ -2018,6 +2237,7 @@ +@@ -2018,6 +2293,7 @@ st->print(name.machine); st->cr(); @@ -4786,7 +4842,7 @@ // Print warning if unsafe chroot environment detected if (unsafe_chroot_detected) { st->print("WARNING!! "); -@@ -2032,6 +2252,7 @@ +@@ -2032,6 +2308,7 @@ st->print("(%s stack)", os::Bsd::is_floating_stack() ? "floating" : "fixed"); } st->cr(); @@ -4794,7 +4850,7 @@ // rlimit st->print("rlimit:"); -@@ -2057,6 +2278,7 @@ +@@ -2057,6 +2334,7 @@ if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); else st->print("%d", rlim.rlim_cur); @@ -4802,7 +4858,7 @@ st->print(", AS "); getrlimit(RLIMIT_AS, &rlim); if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); -@@ -2069,11 +2291,7 @@ +@@ -2069,11 +2347,7 @@ os::loadavg(loadavg, 3); st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); st->cr(); @@ -4815,11 +4871,29 @@ } void os::print_memory_info(outputStream* st) { -@@ -2081,18 +2299,27 @@ +@@ -2081,19 +2355,55 @@ st->print("Memory:"); st->print(" %dk page", os::vm_page_size()>>10); -+#ifndef _ALLBSD_SOURCE ++#ifdef _ALLBSD_SOURCE ++#ifdef __FreeBSD__ ++ struct xswdev xsw; ++ size_t mibsize, size; ++ int mib[16], n, total = 0, used = 0; ++ ++ mibsize = sizeof(mib) / sizeof(mib[0]); ++ if (sysctlnametomib("vm.swap_info", mib, &mibsize) != -1) { ++ for (n = 0; ; n++) { ++ mib[mibsize] = n; ++ size = sizeof(xsw); ++ if (sysctl(mib, mibsize + 1, &xsw, &size, NULL, 0) == -1) ++ break; ++ total += xsw.xsw_nblks; ++ used += xsw.xsw_used; ++ } ++ } ++#endif ++#else // values in struct sysinfo are "unsigned long" struct sysinfo si; sysinfo(&si); @@ -4829,7 +4903,14 @@ os::physical_memory() >> 10); st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10); -+#ifndef _ALLBSD_SOURCE ++#ifdef _ALLBSD_SOURCE ++#ifdef __FreeBSD__ ++ st->print(", swap " UINT64_FORMAT "k", ++ ((jlong)total * os::vm_page_size()) >> 10); ++ st->print("(" UINT64_FORMAT "k free)", ++ ((jlong)(total - used) * os::vm_page_size()) >> 10); ++#endif ++#else st->print(", swap " UINT64_FORMAT "k", ((jlong)si.totalswap * si.mem_unit) >> 10); st->print("(" UINT64_FORMAT "k free)", @@ -4837,13 +4918,16 @@ +#endif + st->cr(); + ++#ifndef _ALLBSD_SOURCE + // meminfo + st->print("\n/proc/meminfo:\n"); + _print_ascii_file("/proc/meminfo", st); st->cr(); ++#endif } -@@ -2333,19 +2560,29 @@ + // Taken from /usr/include/bits/siginfo.h Supposed to be architecture specific +@@ -2333,19 +2643,29 @@ static volatile jint pending_signals[NSIG+1] = { 0 }; // Bsd(POSIX) specific hand shaking semaphore. @@ -4875,7 +4959,7 @@ } static int check_pending_signals(bool wait) { -@@ -2367,7 +2604,7 @@ +@@ -2367,7 +2687,7 @@ do { thread->set_suspend_equivalent(); // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() @@ -4884,7 +4968,7 @@ // were we externally suspended while we were waiting? threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); -@@ -2378,7 +2615,7 @@ +@@ -2378,7 +2698,7 @@ // while suspended because that would surprise the thread that // suspended us. // @@ -4893,7 +4977,7 @@ thread->java_suspend_self(); } -@@ -2422,10 +2659,10 @@ +@@ -2422,10 +2742,10 @@ return; } @@ -4906,7 +4990,7 @@ os::get_temp_directory(), os::current_process_id(), num); unlink(buf); -@@ -2451,9 +2688,14 @@ +@@ -2451,9 +2771,14 @@ // problem. bool os::commit_memory(char* addr, size_t size, bool exec) { int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; @@ -4921,7 +5005,7 @@ } bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, -@@ -2469,36 +2711,27 @@ +@@ -2469,36 +2794,27 @@ } void os::numa_make_global(char *addr, size_t bytes) { @@ -4963,7 +5047,7 @@ } bool os::get_page_info(char *start, page_info* info) { -@@ -2509,6 +2742,7 @@ +@@ -2509,6 +2825,7 @@ return end; } @@ -4971,7 +5055,7 @@ extern "C" void numa_warn(int number, char *where, ...) { } extern "C" void numa_error(char *where) { } -@@ -2610,104 +2844,26 @@ +@@ -2610,104 +2927,26 @@ os::Bsd::numa_tonode_memory_func_t os::Bsd::_numa_tonode_memory; os::Bsd::numa_interleave_memory_func_t os::Bsd::_numa_interleave_memory; unsigned long* os::Bsd::_numa_all_nodes; @@ -5083,7 +5167,7 @@ return os::uncommit_memory(addr, size); } -@@ -2812,6 +2968,9 @@ +@@ -2812,6 +3051,9 @@ static size_t _large_page_size = 0; bool os::large_page_init() { @@ -5093,7 +5177,7 @@ if (!UseLargePages) return false; if (LargePageSizeInBytes) { -@@ -2869,6 +3028,7 @@ +@@ -2869,6 +3111,7 @@ // We optimistically assume the support is available. If later it turns out // not true, VM will automatically switch to use regular page size. return true; @@ -5101,7 +5185,7 @@ } #ifndef SHM_HUGETLB -@@ -3045,7 +3205,7 @@ +@@ -3045,7 +3288,7 @@ } size_t os::read(int fd, void *buf, unsigned int nBytes) { @@ -5110,7 +5194,7 @@ } // TODO-FIXME: reconcile Solaris' os::sleep with the bsd variation. -@@ -3181,6 +3341,44 @@ +@@ -3181,6 +3424,44 @@ // this reason, the code should not be used as default (ThreadPriorityPolicy=0). // It is only used when ThreadPriorityPolicy=1 and requires root privilege. @@ -5155,7 +5239,7 @@ int os::java_to_os_priority[MaxPriority + 1] = { 19, // 0 Entry should never be used -@@ -3198,6 +3396,7 @@ +@@ -3198,6 +3479,7 @@ -5 // 10 MaxPriority }; @@ -5163,7 +5247,7 @@ static int prio_init() { if (ThreadPriorityPolicy == 1) { -@@ -3217,8 +3416,28 @@ +@@ -3217,8 +3499,28 @@ OSReturn os::set_native_priority(Thread* thread, int newpri) { if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK; @@ -5192,7 +5276,7 @@ } OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) { -@@ -3228,7 +3447,17 @@ +@@ -3228,7 +3530,17 @@ } errno = 0; @@ -5210,7 +5294,7 @@ return (*priority_ptr != -1 || errno == 0 ? OS_OK : OS_ERR); } -@@ -3338,7 +3567,7 @@ +@@ -3338,7 +3650,7 @@ /* Get signal number to use for suspend/resume */ if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) { int sig = ::strtol(s, 0, 10); @@ -5219,7 +5303,7 @@ SR_signum = sig; } } -@@ -3682,6 +3911,28 @@ +@@ -3682,6 +3994,28 @@ set_signal_handler(SIGFPE, true); set_signal_handler(SIGXFSZ, true); @@ -5248,7 +5332,7 @@ if (libjsig_is_loaded) { // Tell libjsig jvm finishes setting signal handlers (*end_signal_setting)(); -@@ -3702,6 +3953,7 @@ +@@ -3702,6 +4036,7 @@ } } @@ -5256,7 +5340,7 @@ // This is the fastest way to get thread cpu time on Bsd. // Returns cpu time (user+sys) for any thread, not only for current. // POSIX compliant clocks are implemented in the kernels 2.6.16+. -@@ -3716,6 +3968,7 @@ +@@ -3716,6 +4051,7 @@ return (tp.tv_sec * SEC_IN_NANOSECS) + tp.tv_nsec; } @@ -5264,7 +5348,7 @@ ///// // glibc on Bsd platform uses non-documented flag -@@ -3937,13 +4190,13 @@ +@@ -3937,13 +4273,13 @@ _initial_pid = (java_launcher_pid > 0) ? java_launcher_pid : getpid(); @@ -5280,7 +5364,7 @@ if (Bsd::page_size() == -1) { fatal(err_msg("os_bsd.cpp: os::init: sysconf failed (%s)", strerror(errno))); -@@ -3957,7 +4210,16 @@ +@@ -3957,7 +4293,16 @@ Bsd::clock_init(); initial_time_count = os::elapsed_counter(); @@ -5298,7 +5382,7 @@ } // To install functions for atexit system call -@@ -3970,7 +4232,9 @@ +@@ -3970,7 +4315,9 @@ // this is called _after_ the global arguments have been parsed jint os::init_2(void) { @@ -5308,7 +5392,7 @@ // Allocate a single page and mark it as readable for safepoint polling address polling_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); -@@ -4028,6 +4292,7 @@ +@@ -4028,6 +4375,7 @@ JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, vm_page_size())); @@ -5316,7 +5400,7 @@ Bsd::capture_initial_stack(JavaThread::stack_size_at_create()); Bsd::libpthread_init(); -@@ -4050,6 +4315,7 @@ +@@ -4050,6 +4398,7 @@ UseNUMA = true; } } @@ -5324,7 +5408,7 @@ if (MaxFDLimit) { // set the number of file descriptors to max. print out error -@@ -4061,6 +4327,14 @@ +@@ -4061,6 +4410,14 @@ perror("os::init_2 getrlimit failed"); } else { nbr_files.rlim_cur = nbr_files.rlim_max; @@ -5339,7 +5423,7 @@ status = setrlimit(RLIMIT_NOFILE, &nbr_files); if (status != 0) { if (PrintMiscellaneous && (Verbose || WizardMode)) -@@ -4069,8 +4343,10 @@ +@@ -4069,8 +4426,10 @@ } } @@ -5350,11 +5434,25 @@ // at-exit methods are called in the reverse order of their registration. // atexit functions are called on return from main or as a result of a -@@ -4114,11 +4390,15 @@ +@@ -4114,11 +4473,29 @@ }; int os::active_processor_count() { +#ifdef _ALLBSD_SOURCE ++#ifdef __FreeBSD__ ++ int online_cpus = 0; ++#if __FreeBSD_version > 700109 ++ std::bitset<CPU_SETSIZE> mask; ++ assert(sizeof(mask) == sizeof(cpuset_t), "Invalid bitset for cpuset_t"); ++ if (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, sizeof(mask), ++ reinterpret_cast<cpuset_t*>(&mask)) == 0) ++ online_cpus = mask.count(); ++#else ++ online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN); ++#endif ++ if (online_cpus > 0 && online_cpus <= _processor_count) ++ return online_cpus; ++#endif + return _processor_count; +#else // Bsd doesn't yet have a (official) notion of processor sets, @@ -5366,7 +5464,7 @@ } bool os::distribute_processes(uint length, uint* distribution) { -@@ -4160,6 +4440,9 @@ +@@ -4160,6 +4537,9 @@ int os::Bsd::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime) { @@ -5376,7 +5474,7 @@ if (is_NPTL()) { return pthread_cond_timedwait(_cond, _mutex, _abstime); } else { -@@ -4175,6 +4458,7 @@ +@@ -4175,6 +4555,7 @@ #endif // IA64 return status; } @@ -5384,7 +5482,7 @@ } //////////////////////////////////////////////////////////////////////////////// -@@ -4322,14 +4606,14 @@ +@@ -4322,14 +4703,14 @@ int o_delete = (oflag & O_DELETE); oflag = oflag & ~O_DELETE; @@ -5403,7 +5501,7 @@ if (ret != -1) { if ((st_mode & S_IFMT) == S_IFDIR) { -@@ -4386,17 +4670,17 @@ +@@ -4386,17 +4767,17 @@ if (!rewrite_existing) { oflags |= O_EXCL; } @@ -5424,7 +5522,7 @@ } // This code originates from JDK's sysAvailable -@@ -4405,10 +4689,10 @@ +@@ -4405,10 +4786,10 @@ int os::available(int fd, jlong *bytes) { jlong cur, end; int mode; @@ -5438,7 +5536,7 @@ if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { /* * XXX: is the following call interruptible? If so, this might -@@ -4422,11 +4706,11 @@ +@@ -4422,11 +4803,11 @@ } } } @@ -5453,7 +5551,7 @@ return 0; } *bytes = end - cur; -@@ -4489,6 +4773,7 @@ +@@ -4489,6 +4870,7 @@ return munmap(addr, bytes) == 0; } @@ -5461,7 +5559,7 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time); static clockid_t thread_cpu_clockid(Thread* thread) { -@@ -4500,6 +4785,7 @@ +@@ -4500,6 +4882,7 @@ assert(rc == 0, "pthread_getcpuclockid is expected to return 0 code"); return clockid; } @@ -5469,7 +5567,7 @@ // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) // are used by JVM M&M and JVMTI to get user+sys or user CPU time -@@ -4509,39 +4795,71 @@ +@@ -4509,39 +4892,71 @@ // the fast estimate available on the platform. jlong os::current_thread_cpu_time() { @@ -5541,7 +5639,7 @@ // // -1 on error. // -@@ -4631,6 +4949,7 @@ +@@ -4631,6 +5046,7 @@ return (jlong)user_time * (1000000000 / clock_tics_per_sec); } } @@ -5549,21 +5647,21 @@ void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits -@@ -4647,7 +4966,13 @@ +@@ -4647,7 +5063,13 @@ } bool os::is_thread_cpu_time_supported() { +#ifdef __APPLE__ -+ return true; + return true; +#elif defined(_ALLBSD_SOURCE) + return false; +#else - return true; ++ return true; +#endif } // System loadavg support. Returns -1 if load average cannot be obtained. -@@ -4780,7 +5105,7 @@ +@@ -4780,7 +5202,7 @@ // abstime will be the absolute timeout time // TODO: replace compute_abstime() with unpackTime() @@ -5572,7 +5670,7 @@ if (millis < 0) millis = 0; struct timeval now; int status = gettimeofday(&now, NULL); -@@ -4832,7 +5157,7 @@ +@@ -4832,7 +5254,7 @@ status = pthread_cond_wait(_cond, _mutex); // for some reason, under 2.7 lwp_cond_wait() may return ETIME ... // Treat this the same as if the wait was interrupted @@ -5581,7 +5679,7 @@ assert_status(status == 0 || status == EINTR, status, "cond_wait"); } -- _nParked ; -@@ -4890,10 +5215,10 @@ +@@ -4890,10 +5312,10 @@ pthread_cond_init (_cond, NULL) ; } assert_status(status == 0 || status == EINTR || @@ -5594,7 +5692,7 @@ // We consume and ignore EINTR and spurious wakeups. } --_nParked ; -@@ -4985,7 +5310,7 @@ +@@ -4985,7 +5407,7 @@ * years from "now". */ @@ -5603,7 +5701,7 @@ assert (time > 0, "convertTime"); struct timeval now; -@@ -5045,7 +5370,7 @@ +@@ -5045,7 +5467,7 @@ } // Next, demultiplex/decode time arguments @@ -5612,7 +5710,7 @@ if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all return; } -@@ -5099,7 +5424,7 @@ +@@ -5099,7 +5521,7 @@ } } assert_status(status == 0 || status == EINTR || @@ -5621,7 +5719,7 @@ status, "cond_timedwait"); #ifdef ASSERT -@@ -5142,14 +5467,12 @@ +@@ -5142,14 +5564,12 @@ } @@ -5641,7 +5739,7 @@ #endif // Run the specified command in a separate process. Return its exit value, -@@ -5164,8 +5487,7 @@ +@@ -5164,8 +5584,7 @@ // separate process to execve. Make a direct syscall to fork process. // On IA64 there's no fork syscall, we have to use fork() and hope for // the best... @@ -5651,7 +5749,7 @@ if (pid < 0) { // fork failed -@@ -5181,8 +5503,7 @@ +@@ -5181,8 +5600,7 @@ // in the new process, so make a system call directly. // IA64 should use normal execve() from glibc to match the glibc fork() // above. @@ -5872,7 +5970,16 @@ os::fork_and_exec(buf); --- hotspot/src/os/posix/launcher/java_md.c +++ hotspot/src/os/posix/launcher/java_md.c -@@ -41,14 +41,21 @@ +@@ -35,20 +35,30 @@ + #include <sys/stat.h> + #include <unistd.h> + #include <sys/types.h> ++#ifndef _SC_PHYS_PAGES ++#include <sys/sysctl.h> ++#endif + + #ifndef GAMMA + #include "manifest_info.h" #include "version_comp.h" #endif @@ -5895,7 +6002,7 @@ #ifndef GAMMA /* launcher.make defines ARCH */ /* -@@ -89,7 +96,7 @@ +@@ -89,7 +99,7 @@ * A collection of useful strings. One should think of these as #define * entries, but actual strings can be more efficient (with many compilers). */ @@ -5904,7 +6011,7 @@ static const char *system_dir = "/usr/java"; static const char *user_dir = "/java"; #else /* Solaris */ -@@ -423,10 +430,10 @@ +@@ -423,10 +433,10 @@ * If not on Solaris, assume only a single LD_LIBRARY_PATH * variable. */ @@ -5917,7 +6024,7 @@ /* * On linux, if a binary is running as sgid or suid, glibc sets * LD_LIBRARY_PATH to the empty string for security purposes. (In -@@ -442,6 +449,22 @@ +@@ -442,6 +452,22 @@ if((getgid() != getegid()) || (getuid() != geteuid()) ) { return; } @@ -5940,7 +6047,7 @@ #endif /* runpath contains current effective LD_LIBRARY_PATH setting */ -@@ -450,7 +473,7 @@ +@@ -450,7 +476,7 @@ new_runpath = JLI_MemAlloc( ((runpath!=NULL)?strlen(runpath):0) + 2*strlen(jrepath) + 2*strlen(arch) + strlen(jvmpath) + 52); @@ -5949,7 +6056,7 @@ /* -@@ -465,7 +488,7 @@ +@@ -465,7 +491,7 @@ /* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */ @@ -5958,7 +6065,16 @@ "%s:" "%s/lib/%s:" "%s/../lib/%s", -@@ -792,7 +815,7 @@ +@@ -503,7 +529,7 @@ + * LD_LIBRARY_PATH. Note that this prevents any possible infinite + * loop of execv() because we test for the prefix, above. + */ +- if (runpath != 0) { ++ if (runpath != 0 && runpath[0] != '\0') { + strcat(new_runpath, ":"); + strcat(new_runpath, runpath); + } +@@ -792,7 +818,7 @@ jboolean GetApplicationHome(char *buf, jint bufsize) { @@ -5967,7 +6083,7 @@ char *execname = GetExecname(); if (execname) { strncpy(buf, execname, bufsize-1); -@@ -961,9 +984,13 @@ +@@ -961,9 +987,13 @@ } } } @@ -5982,7 +6098,7 @@ char buf[PATH_MAX+1]; int len = readlink(self, buf, PATH_MAX); if (len >= 0) { -@@ -971,7 +998,7 @@ +@@ -971,7 +1001,7 @@ exec_path = JLI_StringDup(buf); } } @@ -5991,7 +6107,44 @@ { /* Not implemented */ } -@@ -1175,7 +1202,7 @@ +@@ -1069,6 +1099,7 @@ + /* Compute physical memory by asking the OS */ + uint64_t + physical_memory(void) { ++#ifdef _SC_PHYS_PAGES + const uint64_t pages = (uint64_t) sysconf(_SC_PHYS_PAGES); + const uint64_t page_size = (uint64_t) sysconf(_SC_PAGESIZE); + const uint64_t result = pages * page_size; +@@ -1080,6 +1111,28 @@ + " physical memory: " UINT64_FORMAT " (%.3fGB)\n", + pages, page_size, result, result / (double) GB); + } ++#else ++#ifdef HW_PHYSMEM64 ++ int64_t physmem; ++ int name[2] = { CTL_HW, HW_PHYSMEM64 }; ++#else ++ unsigned long physmem; ++ int name[2] = { CTL_HW, HW_PHYSMEM }; ++#endif ++ size_t physmem_len = sizeof(physmem); ++ uint64_t result; ++# define UINT64_FORMAT "%" PRIu64 ++ ++ if (sysctl(name, 2, &physmem, &physmem_len, NULL, 0) == -1) ++ physmem = 256 * MB; ++ ++ result = (uint64_t)physmem; ++ ++ if (_launcher_debug) { ++ printf("physical memory: " UINT64_FORMAT " (%.3fGB)\n", ++ result, result / (double) GB); ++ } ++#endif + return result; + } + +@@ -1175,7 +1228,7 @@ #endif /* __sun && i586 */ @@ -6000,7 +6153,7 @@ /* * A utility method for asking the CPU about itself. -@@ -1240,7 +1267,7 @@ +@@ -1240,7 +1293,7 @@ #endif } @@ -6009,7 +6162,7 @@ #ifdef i586 /* -@@ -1452,6 +1479,39 @@ +@@ -1452,6 +1505,39 @@ #endif /* __linux__ && i586 */ @@ -6038,7 +6191,7 @@ + } + } + if (_launcher_debug) { -+ printf("linux_" LIBARCHNAME "_ServerClassMachine: %s\n", ++ printf("bsd_" LIBARCHNAME "_ServerClassMachine: %s\n", + (result == JNI_TRUE ? "true" : "false")); + } + return result; @@ -6049,7 +6202,7 @@ /* Dispatch to the platform-specific definition of "server-class" */ jboolean ServerClassMachine(void) { -@@ -1466,6 +1526,8 @@ +@@ -1466,6 +1552,8 @@ result = solaris_i586_ServerClassMachine(); #elif defined(__linux__) && defined(i586) result = linux_i586_ServerClassMachine(); @@ -6058,7 +6211,16 @@ #else if (_launcher_debug) { printf("ServerClassMachine: returns default value of %s\n", -@@ -1821,7 +1883,7 @@ +@@ -1606,7 +1694,7 @@ + while (dp != NULL) { + cp = strchr(dp, (int)':'); + if (cp != NULL) +- *cp = (char)NULL; ++ *cp = '\0'; + if ((target = ProcessDir(info, dp)) != NULL) + break; + dp = cp; +@@ -1821,7 +1909,7 @@ int ContinueInNewThread(int (JNICALL *continuation)(void *), jlong stack_size, void * args) { int rslt; @@ -6067,6 +6229,17 @@ pthread_t tid; pthread_attr_t attr; pthread_attr_init(&attr); +@@ -1865,8 +1953,8 @@ + #define MAX_PID_STR_SZ 20 + + void SetJavaLauncherPlatformProps() { +- /* Linux only */ +-#ifdef __linux__ ++ /* Linux and BSDs only */ ++#if defined(__linux__) || defined(_ALLBSD_SOURCE) + const char *substr = "-Dsun.java.launcher.pid="; + char *pid_prop_str = (char *)JLI_MemAlloc(strlen(substr) + MAX_PID_STR_SZ + 1); + sprintf(pid_prop_str, "%s%d", substr, getpid()); --- hotspot/src/os/posix/launcher/launcher.script +++ hotspot/src/os/posix/launcher/launcher.script @@ -1,4 +1,4 @@ @@ -14099,11 +14272,34 @@ #endif /* __sun */ -#ifdef __linux -+#if defined(__linux__) || defined(_ALLBSD_SOURCE) ++#if defined(__linux__) /* * On linux, if a binary is running as sgid or suid, glibc sets * LD_LIBRARY_PATH to the empty string for security purposes. (In -@@ -431,7 +465,7 @@ +@@ -423,6 +457,22 @@ + if((getgid() != getegid()) || (getuid() != geteuid()) ) { + return; + } ++#elif defined(_ALLBSD_SOURCE) ++ /* ++ * On BSD, if a binary is running as sgid or suid, libc sets ++ * LD_LIBRARY_PATH to the empty string for security purposes. (In ++ * contrast, on Solaris the LD_LIBRARY_PATH variable for a ++ * privileged binary does not lose its settings; but the dynamic ++ * linker does apply more scrutiny to the path.) The launcher uses ++ * the value of LD_LIBRARY_PATH to prevent an exec loop. ++ * Therefore, if we are running sgid or suid, this function's ++ * setting of LD_LIBRARY_PATH will be ineffective and we should ++ * return from the function now. Getting the right libraries to ++ * be found must be handled through other mechanisms. ++ */ ++ if(issetugid()) { ++ return; ++ } + #endif + + /* runpath contains current effective LD_LIBRARY_PATH setting */ +@@ -431,7 +481,7 @@ new_runpath = JLI_MemAlloc( ((runpath!=NULL)?strlen(runpath):0) + 2*strlen(jrepath) + 2*strlen(arch) + strlen(jvmpath) + 52); @@ -14112,7 +14308,7 @@ /* -@@ -446,7 +480,7 @@ +@@ -446,7 +496,7 @@ /* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */ @@ -14121,7 +14317,16 @@ "%s:" "%s/lib/%s:" "%s/../lib/%s", -@@ -878,9 +912,13 @@ +@@ -721,7 +771,7 @@ + jboolean + GetApplicationHome(char *buf, jint bufsize) + { +-#ifdef __linux__ ++#if defined(__linux__) || defined(_ALLBSD_SOURCE) + char *execname = GetExecname(); + if (execname) { + strncpy(buf, execname, bufsize-1); +@@ -878,9 +928,13 @@ } } } @@ -14136,7 +14341,7 @@ char buf[PATH_MAX+1]; int len = readlink(self, buf, PATH_MAX); if (len >= 0) { -@@ -888,7 +926,7 @@ +@@ -888,7 +942,7 @@ exec_path = JLI_StringDup(buf); } } @@ -14145,7 +14350,7 @@ { /* Not implemented */ } -@@ -977,6 +1015,7 @@ +@@ -977,6 +1031,7 @@ /* Compute physical memory by asking the OS */ uint64_t physical_memory(void) { @@ -14153,7 +14358,7 @@ const uint64_t pages = (uint64_t) sysconf(_SC_PHYS_PAGES); const uint64_t page_size = (uint64_t) sysconf(_SC_PAGESIZE); const uint64_t result = pages * page_size; -@@ -988,6 +1027,28 @@ +@@ -988,6 +1043,28 @@ " physical memory: " UINT64_FORMAT " (%.3fGB)\n", pages, page_size, result, result / (double) GB); } @@ -14182,7 +14387,7 @@ return result; } -@@ -1083,7 +1144,7 @@ +@@ -1083,7 +1160,7 @@ #endif /* __sun && i586 */ @@ -14191,7 +14396,74 @@ /* * A utility method for asking the CPU about itself. -@@ -1692,9 +1753,23 @@ +@@ -1148,7 +1225,7 @@ + #endif + } + +-#endif /* __linux__ && i586 */ ++#endif /* (__linux__ || _ALLBSD_SOURCE) && i586 */ + + #ifdef i586 + /* +@@ -1360,6 +1437,39 @@ + + #endif /* __linux__ && i586 */ + ++#if defined(_ALLBSD_SOURCE) && defined(i586) ++ ++/* The definition of a server-class machine for bsd-i586 */ ++jboolean ++bsd_i586_ServerClassMachine(void) { ++ jboolean result = JNI_FALSE; ++ /* How big is a server class machine? */ ++ const unsigned long server_processors = 2UL; ++ const uint64_t server_memory = 2UL * GB; ++ /* ++ * We seem not to get our full complement of memory. ++ * We allow some part (1/8?) of the memory to be "missing", ++ * based on the sizes of DIMMs, and maybe graphics cards. ++ */ ++ const uint64_t missing_memory = 256UL * MB; ++ const uint64_t actual_memory = physical_memory(); ++ ++ /* Is this a server class machine? */ ++ if (actual_memory >= (server_memory - missing_memory)) { ++ const unsigned long actual_processors = physical_processors(); ++ if (actual_processors >= server_processors) { ++ result = JNI_TRUE; ++ } ++ } ++ if (_launcher_debug) { ++ printf("bsd_" LIBARCHNAME "_ServerClassMachine: %s\n", ++ (result == JNI_TRUE ? "true" : "false")); ++ } ++ return result; ++} ++ ++#endif /* _ALLBSD_SOURCE && i586 */ ++ + /* Dispatch to the platform-specific definition of "server-class" */ + jboolean + ServerClassMachine(void) { +@@ -1374,6 +1484,8 @@ + result = solaris_i586_ServerClassMachine(); + #elif defined(__linux__) && defined(i586) + result = linux_i586_ServerClassMachine(); ++#elif defined(_ALLBSD_SOURCE) && defined(i586) ++ result = bsd_i586_ServerClassMachine(); + #else + if (_launcher_debug) { + printf("ServerClassMachine: returns default value of %s\n", +@@ -1514,7 +1626,7 @@ + while (dp != NULL) { + cp = strchr(dp, (int)':'); + if (cp != NULL) +- *cp = (char)NULL; ++ *cp = '\0'; + if ((target = ProcessDir(info, dp)) != NULL) + break; + dp = cp; +@@ -1692,9 +1804,29 @@ return(borrowed_unsetenv(name)); } @@ -14202,9 +14474,15 @@ +int64_t +CounterGet() +{ ++#ifdef __FreeBSD__ ++ struct timespec tp; ++ clock_gettime(CLOCK_MONOTONIC, &tp); ++ return (uint64_t)tp.tv_sec * 1000000 + tp.tv_nsec / 1000; ++#else + struct timeval tv; + gettimeofday(&tv, NULL); -+ return (tv.tv_sec * 1000) + tv.tv_usec; ++ return (uint64_t)tv.tv_sec * 1000000 + tv.tv_usec; ++#endif +} +#endif + @@ -14216,7 +14494,7 @@ static void* hSplashLib = NULL; -@@ -1722,13 +1797,15 @@ +@@ -1722,13 +1854,15 @@ return "%lld"; } @@ -14234,7 +14512,23 @@ pthread_t tid; pthread_attr_t attr; pthread_attr_init(&attr); -@@ -1765,13 +1842,11 @@ +@@ -1741,7 +1875,7 @@ + if (pthread_create(&tid, &attr, (void *(*)(void*))continuation, (void*)args) == 0) { + void * tmp; + pthread_join(tid, &tmp); +- rslt = (int)tmp; ++ rslt = (int)(intptr_t)tmp; + } else { + /* + * Continue execution in current thread if for some reason (e.g. out of +@@ -1759,25 +1893,23 @@ + if (thr_create(NULL, stack_size, (void *(*)(void *))continuation, args, flags, &tid) == 0) { + void * tmp; + thr_join(tid, NULL, &tmp); +- rslt = (int)tmp; ++ rslt = (int)(intptr_t)tmp; + } else { + /* See above. Continue in current thread if thr_create() failed */ rslt = continuation(args); } #endif @@ -14251,6 +14545,14 @@ /* Coarse estimation of number of digits assuming the worst case is a 64-bit pid. */ #define MAX_PID_STR_SZ 20 + void SetJavaLauncherPlatformProps() { +- /* Linux only */ +-#ifdef __linux__ ++ /* Linux and BSDs only */ ++#if defined(__linux__) || defined(_ALLBSD_SOURCE) + const char *substr = "-Dsun.java.launcher.pid="; + char *pid_prop_str = (char *)JLI_MemAlloc(strlen(substr) + MAX_PID_STR_SZ + 1); + sprintf(pid_prop_str, "%s%d", substr, getpid()); --- jdk/src/solaris/bin/java_md.h +++ jdk/src/solaris/bin/java_md.h @@ -58,10 +58,14 @@ @@ -16453,17 +16755,26 @@ clk_tck = 100; #endif if (clk_tck == -1) { -@@ -244,32 +310,70 @@ +@@ -244,32 +310,79 @@ Java_com_sun_management_UnixOperatingSystem_getFreePhysicalMemorySize (JNIEnv *env, jobject mbean) { +#if defined (__FreeBSD__) -+ int npages; ++ static const char *vm_stats[] = { ++ "vm.stats.vm.v_free_count", ++ "vm.stats.vm.v_cache_count", ++ /* "vm.stats.vm.v_inactive_count", */ ++ NULL ++ }; + size_t size; -+ size = sizeof(npages); -+ if (sysctlbyname("vm.stats.vm.v_free_count", &npages, &size, NULL, 0) == - 1) -+ return (0); -+ return ((jlong)npages * page_size); ++ jlong free_pages; ++ u_int i, npages; ++ for (i = 0, free_pages = 0, size = sizeof(npages); vm_stats[i] != NULL; i++) { ++ if (sysctlbyname(vm_stats[i], &npages, &size, NULL, 0) == -1) ++ return 0; ++ free_pages += npages; ++ } ++ return (free_pages * page_size); +#elif defined(_ALLBSD_SOURCE) + // throw_internal_error(env, "Unimplemented in BSD"); + return (128 * MB); @@ -16524,7 +16835,7 @@ // iterate through directory entries, skipping '.' and '..' // each entry represents an open file descriptor. -@@ -282,6 +386,7 @@ +@@ -282,6 +395,7 @@ closedir(dirp); // subtract by 1 which was the fd open for this implementation return (fds - 1); |