# HG changeset patch # User Andrew John Hughes # Date 1363027463 0 # Node ID f6cbaa56daa33f53c1c97ee575602da825a0d92c # Parent b7e507e31613648a2ecb36308df4a5817e1203d3 Revert 7017193 and add the missing free call on a -1 return, until a better fix is ready. http://mail.openjdk.java.net/pipermail/hotspot-dev/2013-February/008695.html 2013-03-11 Andrew John Hughes * Makefile.am: (ICEDTEA_PATCHES): Add new patch. * patches/revert-7017193.patch: Revert 7017193 due to performance issues, adding a free call on error, until a better fix is produced. * NEWS: Updated. diff -r b7e507e31613 -r f6cbaa56daa3 ChangeLog --- a/ChangeLog Mon Mar 11 16:31:39 2013 +0000 +++ b/ChangeLog Mon Mar 11 18:44:23 2013 +0000 @@ -1,3 +1,13 @@ +2013-03-11 Andrew John Hughes + + * Makefile.am: + (ICEDTEA_PATCHES): Add new patch. + * patches/revert-7017193.patch: + Revert 7017193 due to performance issues, + adding a free call on error, until a better + fix is produced. + * NEWS: Updated. + 2013-03-11 Andrew John Hughes PR1340: Simplify the rewriter, avoiding concurrency. diff -r b7e507e31613 -r f6cbaa56daa3 Makefile.am --- a/Makefile.am Mon Mar 11 16:31:39 2013 +0000 +++ b/Makefile.am Mon Mar 11 18:44:23 2013 +0000 @@ -240,7 +240,8 @@ patches/8004344-toolkiterrorhandler.patch \ patches/8006179-lookup_using_findvirtual.patch \ patches/8006882-sun.proxy.patch \ - patches/pr1303-ifdef_fix.patch + patches/pr1303-ifdef_fix.patch \ + patches/revert-7017193.patch # Conditional patches diff -r b7e507e31613 -r f6cbaa56daa3 NEWS --- a/NEWS Mon Mar 11 16:31:39 2013 +0000 +++ b/NEWS Mon Mar 11 18:44:23 2013 +0000 @@ -23,6 +23,7 @@ * Bug fixes - PR1303: Correct #ifdef to #if - PR1340: Simplify the rhino class rewriter to avoid use of concurrency + - Revert 7017193 and add the missing free call, until a better fix is ready. New in release 2.2.6 (2013-02-20): diff -r b7e507e31613 -r f6cbaa56daa3 patches/revert-7017193.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/revert-7017193.patch Mon Mar 11 18:44:23 2013 +0000 @@ -0,0 +1,138 @@ +diff --git a/src/os/linux/vm/os_linux.cpp b/src/os/linux/vm/os_linux.cpp +--- openjdk/hotspot/src/os/linux/vm/os_linux.cpp ++++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp +@@ -2763,39 +2763,47 @@ + // writing thread stacks don't use growable mappings (i.e. those + // creeated with MAP_GROWSDOWN), and aren't marked "[stack]", so this + // only applies to the main thread. +- +-static +-bool get_stack_bounds(uintptr_t *bottom, uintptr_t *top) { +- +- char buf[128]; +- int fd, sz; +- +- if ((fd = ::open("/proc/self/maps", O_RDONLY)) < 0) { ++static bool ++get_stack_bounds(uintptr_t *bottom, uintptr_t *top) ++{ ++ FILE *f = fopen("/proc/self/maps", "r"); ++ if (f == NULL) + return false; +- } +- +- const char kw[] = "[stack]"; +- const int kwlen = sizeof(kw)-1; +- +- // Address part of /proc/self/maps couldn't be more than 128 bytes +- while ((sz = os::get_line_chars(fd, buf, sizeof(buf))) > 0) { +- if (sz > kwlen && ::memcmp(buf+sz-kwlen, kw, kwlen) == 0) { +- // Extract addresses +- if (sscanf(buf, "%" SCNxPTR "-%" SCNxPTR, bottom, top) == 2) { +- uintptr_t sp = (uintptr_t) __builtin_frame_address(0); +- if (sp >= *bottom && sp <= *top) { +- ::close(fd); +- return true; +- } ++ ++ while (!feof(f)) { ++ size_t dummy; ++ char *str = NULL; ++ ssize_t len = getline(&str, &dummy, f); ++ if (len == -1) { ++ fclose(f); ++ if (str != NULL) ++ free(str); ++ return false; ++ } ++ ++ if (len > 0 && str[len-1] == '\n') { ++ str[len-1] = 0; ++ len--; ++ } ++ ++ static const char *stack_str = "[stack]"; ++ if (len > (ssize_t)strlen(stack_str) ++ && (strcmp(str + len - strlen(stack_str), stack_str) == 0)) { ++ if (sscanf(str, "%" SCNxPTR "-%" SCNxPTR, bottom, top) == 2) { ++ uintptr_t sp = (uintptr_t)__builtin_frame_address(0); ++ if (sp >= *bottom && sp <= *top) { ++ free(str); ++ fclose(f); ++ return true; + } +- } +- } +- +- ::close(fd); ++ } ++ } ++ free(str); ++ } ++ fclose(f); + return false; + } + +- + // If the (growable) stack mapping already extends beyond the point + // where we're going to put our guard pages, truncate the mapping at + // that point by munmap()ping it. This ensures that when we later +diff --git a/src/share/vm/runtime/os.cpp b/src/share/vm/runtime/os.cpp +--- openjdk/hotspot/src/share/vm/runtime/os.cpp ++++ openjdk/hotspot/src/share/vm/runtime/os.cpp +@@ -1331,41 +1331,3 @@ + } + return result; + } +- +-// Read file line by line, if line is longer than bsize, +-// skip rest of line. +-int os::get_line_chars(int fd, char* buf, const size_t bsize){ +- size_t sz, i = 0; +- +- // read until EOF, EOL or buf is full +- while ((sz = (int) read(fd, &buf[i], 1)) == 1 && i < (bsize-2) && buf[i] != '\n') { +- ++i; +- } +- +- if (buf[i] == '\n') { +- // EOL reached so ignore EOL character and return +- +- buf[i] = 0; +- return (int) i; +- } +- +- buf[i+1] = 0; +- +- if (sz != 1) { +- // EOF reached. if we read chars before EOF return them and +- // return EOF on next call otherwise return EOF +- +- return (i == 0) ? -1 : (int) i; +- } +- +- // line is longer than size of buf, skip to EOL +- char ch; +- while (read(fd, &ch, 1) == 1 && ch != '\n') { +- // Do nothing +- } +- +- // return initial part of line that fits in buf. +- // If we reached EOF, it will be returned on next call. +- +- return (int) i; +-} +diff --git a/src/share/vm/runtime/os.hpp b/src/share/vm/runtime/os.hpp +--- openjdk/hotspot/src/share/vm/runtime/os.hpp ++++ openjdk/hotspot/src/share/vm/runtime/os.hpp +@@ -672,10 +672,6 @@ + // Hook for os specific jvm options that we don't want to abort on seeing + static bool obsolete_option(const JavaVMOption *option); + +- // Read file line by line. If line is longer than bsize, +- // rest of line is skipped. Returns number of bytes read or -1 on EOF +- static int get_line_chars(int fd, char *buf, const size_t bsize); +- + // Extensions + #include "runtime/os_ext.hpp" +