# HG changeset patch # User cjplummer # Date 1415221259 28800 # Node ID 07948a5f8f5c45ef4b8e413ee89574d9da27a664 # Parent cdc1d5bc86cf69e4b5103d5b64ddac3eab256f91 8043770: File leak in MemNotifyThread::start() in hotspot.src.os.linux.vm.os_linux.cpp Summary: Fixed by removing all code related to LowMemoryProtection, which removed offending code. Reviewed-by: dholmes, minqi diff -r cdc1d5bc86cf -r 07948a5f8f5c hotspot/src/os/aix/vm/os_aix.cpp --- a/hotspot/src/os/aix/vm/os_aix.cpp Mon Nov 03 11:34:13 2014 -0800 +++ b/hotspot/src/os/aix/vm/os_aix.cpp Wed Nov 05 13:00:59 2014 -0800 @@ -3829,11 +3829,6 @@ return JNI_OK; } -// this is called at the end of vm_initialization -void os::init_3(void) { - return; -} - // Mark the polling page as unreadable void os::make_polling_page_unreadable(void) { if (!guard_memory((char*)_polling_page, Aix::page_size())) { diff -r cdc1d5bc86cf -r 07948a5f8f5c hotspot/src/os/bsd/vm/os_bsd.cpp --- a/hotspot/src/os/bsd/vm/os_bsd.cpp Mon Nov 03 11:34:13 2014 -0800 +++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Wed Nov 05 13:00:59 2014 -0800 @@ -3635,9 +3635,6 @@ return JNI_OK; } -// this is called at the end of vm_initialization -void os::init_3(void) { } - // Mark the polling page as unreadable void os::make_polling_page_unreadable(void) { if (!guard_memory((char*)_polling_page, Bsd::page_size())) { diff -r cdc1d5bc86cf -r 07948a5f8f5c hotspot/src/os/linux/vm/os_linux.cpp --- a/hotspot/src/os/linux/vm/os_linux.cpp Mon Nov 03 11:34:13 2014 -0800 +++ b/hotspot/src/os/linux/vm/os_linux.cpp Wed Nov 05 13:00:59 2014 -0800 @@ -163,35 +163,6 @@ // Declarations static void unpackTime(timespec* absTime, bool isAbsolute, jlong time); -#ifdef JAVASE_EMBEDDED -class MemNotifyThread: public Thread { - friend class VMStructs; - public: - virtual void run(); - - private: - static MemNotifyThread* _memnotify_thread; - int _fd; - - public: - - // Constructor - MemNotifyThread(int fd); - - // Tester - bool is_memnotify_thread() const { return true; } - - // Printing - char* name() const { return (char*)"Linux MemNotify Thread"; } - - // Returns the single instance of the MemNotifyThread - static MemNotifyThread* memnotify_thread() { return _memnotify_thread; } - - // Create and start the single instance of MemNotifyThread - static void start(); -}; -#endif // JAVASE_EMBEDDED - // utility functions static int SR_initialize(); @@ -4866,17 +4837,6 @@ return JNI_OK; } -// this is called at the end of vm_initialization -void os::init_3(void) { -#ifdef JAVASE_EMBEDDED - // Start the MemNotifyThread - if (LowMemoryProtection) { - MemNotifyThread::start(); - } - return; -#endif -} - // Mark the polling page as unreadable void os::make_polling_page_unreadable(void) { if (!guard_memory((char*)_polling_page, Linux::page_size())) { @@ -6033,82 +5993,6 @@ return strlen(buffer); } -#ifdef JAVASE_EMBEDDED -// -// A thread to watch the '/dev/mem_notify' device, which will tell us when the OS is running low on memory. -// -MemNotifyThread* MemNotifyThread::_memnotify_thread = NULL; - -// ctor -// -MemNotifyThread::MemNotifyThread(int fd): Thread() { - assert(memnotify_thread() == NULL, "we can only allocate one MemNotifyThread"); - _fd = fd; - - if (os::create_thread(this, os::os_thread)) { - _memnotify_thread = this; - os::set_priority(this, NearMaxPriority); - os::start_thread(this); - } -} - -// Where all the work gets done -// -void MemNotifyThread::run() { - assert(this == memnotify_thread(), "expected the singleton MemNotifyThread"); - - // Set up the select arguments - fd_set rfds; - if (_fd != -1) { - FD_ZERO(&rfds); - FD_SET(_fd, &rfds); - } - - // Now wait for the mem_notify device to wake up - while (1) { - // Wait for the mem_notify device to signal us.. - int rc = select(_fd+1, _fd != -1 ? &rfds : NULL, NULL, NULL, NULL); - if (rc == -1) { - perror("select!\n"); - break; - } else if (rc) { - //ssize_t free_before = os::available_memory(); - //tty->print ("Notified: Free: %dK \n",os::available_memory()/1024); - - // The kernel is telling us there is not much memory left... - // try to do something about that - - // If we are not already in a GC, try one. - if (!Universe::heap()->is_gc_active()) { - Universe::heap()->collect(GCCause::_allocation_failure); - - //ssize_t free_after = os::available_memory(); - //tty->print ("Post-Notify: Free: %dK\n",free_after/1024); - //tty->print ("GC freed: %dK\n", (free_after - free_before)/1024); - } - // We might want to do something like the following if we find the GC's are not helping... - // Universe::heap()->size_policy()->set_gc_time_limit_exceeded(true); - } - } -} - -// See if the /dev/mem_notify device exists, and if so, start a thread to monitor it. -// -void MemNotifyThread::start() { - int fd; - fd = open("/dev/mem_notify", O_RDONLY, 0); - if (fd < 0) { - return; - } - - if (memnotify_thread() == NULL) { - new MemNotifyThread(fd); - } -} - -#endif // JAVASE_EMBEDDED - - /////////////// Unit tests /////////////// #ifndef PRODUCT diff -r cdc1d5bc86cf -r 07948a5f8f5c hotspot/src/os/solaris/vm/os_solaris.cpp --- a/hotspot/src/os/solaris/vm/os_solaris.cpp Mon Nov 03 11:34:13 2014 -0800 +++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Wed Nov 05 13:00:59 2014 -0800 @@ -4761,10 +4761,6 @@ return JNI_OK; } -void os::init_3(void) { - return; -} - // Mark the polling page as unreadable void os::make_polling_page_unreadable(void) { if (mprotect((char *)_polling_page, page_size, PROT_NONE) != 0) { diff -r cdc1d5bc86cf -r 07948a5f8f5c hotspot/src/os/windows/vm/os_windows.cpp --- a/hotspot/src/os/windows/vm/os_windows.cpp Mon Nov 03 11:34:13 2014 -0800 +++ b/hotspot/src/os/windows/vm/os_windows.cpp Wed Nov 05 13:00:59 2014 -0800 @@ -4140,10 +4140,6 @@ return JNI_OK; } -void os::init_3(void) { - return; -} - // Mark the polling page as unreadable void os::make_polling_page_unreadable(void) { DWORD old_status; diff -r cdc1d5bc86cf -r 07948a5f8f5c hotspot/src/share/vm/runtime/globals.hpp --- a/hotspot/src/share/vm/runtime/globals.hpp Mon Nov 03 11:34:13 2014 -0800 +++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Nov 05 13:00:59 2014 -0800 @@ -2066,9 +2066,6 @@ "Provide more detailed and expensive TLAB statistics " \ "(with PrintTLAB)") \ \ - EMBEDDED_ONLY(product(bool, LowMemoryProtection, true, \ - "Enable LowMemoryProtection")) \ - \ product_pd(bool, NeverActAsServerClassMachine, \ "Never act like a server-class machine") \ \ diff -r cdc1d5bc86cf -r 07948a5f8f5c hotspot/src/share/vm/runtime/os.hpp --- a/hotspot/src/share/vm/runtime/os.hpp Mon Nov 03 11:34:13 2014 -0800 +++ b/hotspot/src/share/vm/runtime/os.hpp Wed Nov 05 13:00:59 2014 -0800 @@ -158,7 +158,6 @@ static void init_globals(void) { // Called from init_globals() in init.cpp init_globals_ext(); } - static void init_3(void); // Called at the end of vm init // File names are case-insensitive on windows only // Override me as needed diff -r cdc1d5bc86cf -r 07948a5f8f5c hotspot/src/share/vm/runtime/thread.cpp --- a/hotspot/src/share/vm/runtime/thread.cpp Mon Nov 03 11:34:13 2014 -0800 +++ b/hotspot/src/share/vm/runtime/thread.cpp Wed Nov 05 13:00:59 2014 -0800 @@ -3617,9 +3617,6 @@ } } - // Give os specific code one last chance to start - os::init_3(); - create_vm_timer.end(); #ifdef ASSERT _vm_complete = true;