Hi Jeremy, David, I would like to understand the problem better and have some questions, maybe you could answer?
- What is the difference between "static __thread int x" and "__thread int x" - one lives in the thread stacks, one does not? - What happens with existing threads if a library is loaded which uses this form of TLS? - Does this TLS live at the top of the stack? So, to find out if a third party library uses this form of TLS, we could check the distance of sp to the stack base in java_start()? - Would the region returned by pthread_attr_getstack() include the TLS region? Thanks! Kind Regards, Thomas On Tue, Dec 15, 2015 at 8:25 AM, David Holmes <david.hol...@oracle.com> wrote: > On 15/12/2015 4:32 PM, Jeremy Manson wrote: > >> David: What the spec says and what glibc does are two different things: >> >> https://sourceware.org/bugzilla/show_bug.cgi?id=11787 >> >> We have an internal Google patch to compensate for this. Nasty stuff. >> > > Nasty isn't even the right word - this is just ludicrous! And the bug has > just languished even though they were going to fix it years ago!!!!! And I > also cried when I saw the part finally recognizing that glibc does the > wrong thing by taking the guard pages from the requested stack size! > > To me this just screams don't use TLS on linux except for trivially small > data structures, or else use static-TLS. > > Which brings me back to this test - make the variable static! > > Thanks Jeremy. I'm thoroughly depressed now. > > David > ----- > > Jeremy >> >> On Mon, Dec 14, 2015 at 8:44 PM, David Holmes <david.hol...@oracle.com >> <mailto:david.hol...@oracle.com>> wrote: >> >> On 15/12/2015 6:53 AM, Martin Buchholz wrote: >> >> Thread local storage is trouble. >> >> java stack sizes should be in _addition_ to any OS overhead, >> which includes TLS. >> >> >> TLS shouldn't be coming out the stack of the thread AFAIK - I see >> nothing about that in "ELF Handling for Thread Local Storage". That >> is why I want to know more about the test, the compilation >> environment and the execution environment. >> >> IOW, the java thread stack size should actually be available for >> stack frames. >> Hotspot should be fixed, but it's not easy. >> >> >> Do you mean that the value specified at the Java level should be >> rounded up to accommodate guard pages etc at the native level? >> >> David >> ----- >> >> >> On Mon, Dec 14, 2015 at 12:47 PM, David Holmes >> <david.hol...@oracle.com <mailto:david.hol...@oracle.com>> wrote: >> >> On 14/12/2015 11:06 PM, cheleswer sahu wrote: >> >> >> Hi David, >> TLS is thread local storage. In test program it is >> defined using >> >> #define TLS_SIZE 32 >> int __thread XYZ[TLS_SIZE * 1024]; >> >> >> >> Thanks for clarifying. What test is that? I'm guessing this >> may be a linux >> only test? Which platform do you see the problem on? >> >> We don't unconditionally use compiler-based TLS as some >> platforms may not >> support it. >> >> That aside that declaration should really be static I think. >> >> David >> ----- >> >> >> Regards, >> Cheleswer >> On 12/14/2015 6:29 PM, David Holmes wrote: >> >> >> What is TLS in this context? >> >> Thanks, >> David >> >> On 14/12/2015 10:34 PM, cheleswer sahu wrote: >> >> >> Hi, >> >> I am investigating an issue, in which test with >> TLS size set to 32K is >> failing with StackOverFlowError. During >> investigation I found the below >> code >> >> >> http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/tip/src/solaris/classes/java/lang/UNIXProcess.java >> >> >> >> ThreadFactory threadFactory = grimReaper -> { >> // Our thread stack >> requirement is quite modest. >> Thread t = new >> Thread(systemThreadGroup, grimReaper, >> >> "process reaper", 32768); >> >> Here reaper thread is created with fixed stack >> size "32768 ", which >> causes StackOverFlowError when TLS is set to >> 32k around. >> If I remove this fixed size and make it default, >> test works fine. >> >> Thread t = new Thread(systemThreadGroup, >> grimReaper, >> >> "process reaper"); >> >> I have run several test with TLS size 32k , 64k >> ,128k and more . >> The interesting part, it works well with 64k and >> 128k TLS size but not >> with 32k. >> So my questions are as follows: >> >> >> What is the motivation behind the fixed >> thread stack size ? >> will it be ok to replace the fixed stack >> size with default or stack >> >> >> size setting is platform sensitive? >> >> >> How TLS sizes are interpreted internally, >> which allows 64k and 128k >> >> >> to work but not to 32k ? >> >> I would really appreciate, if anyone have any >> opinion on this. >> >> Regards, >> Cheleswer >> >> >> >> >> >> >>