RFR: JDK-8309462: vmTestbase/nsk/jvmti/RunAgentThread/agentthr001/TestDescription.java crashing due to empty while loop
JoKern65
duke at openjdk.org
Tue Jun 6 09:58:54 UTC 2023
The sys_thread_3() function contains an empty while loop, which by the standard can be optimized away. Please refer to discussion in https://github.com/llvm/llvm-project/issues/60622
The xlc17 compiler is doing so, and IBM claims that they are following the standard and will not fix this on compiler side.
So we have (at least) 3 ways to circumvent this behavior.
1. we can introduce the call of a nop library function, which will hinder the optimizer to throw away the loop (This is our proposed solution, but instead of a heavy looping thread, the result is a more or less idle thread):
`#include <unistd.h>`
`static void`
`sys_thread_3(jvmtiEnv* jvmti, JNIEnv* jni, void *p)`
`{`
` while (1) {`
` sleep(1);`
` }`
`}`
2. We can make use of a volatile variable in the loop body which also hinders the optimizer to throw away the loop:
`static void`
`sys_thread_3(jvmtiEnv* jvmti, JNIEnv* jni, void *p)`
`{`
` volatile int i = 1;`
` while (i) {`
` i += 2;`
` }`
`}`
3. we can use the __attribute__ ((optnone)) modifier in the function declaration to suppress the optimization at all:
`static void`
`sys_thread_3(jvmtiEnv* jvmti, JNIEnv* jni, void *p) __attribute__ ((optnone))`
`{`
` while (1) {`
` }`
`}`
To make the third approach platform independent, we can implement it in the following way:
In globalDefinitions.hpp
`#ifndef OPTNONE`
`#define OPTNONE`
`#endif`
In globalDefinitions_xlc.hpp
`// optnone support`
`//`
`// To use if a function should not be optimized`
`// Usage:`
`// void* func(size_t size) OPTNONE {...}`
`#define OPTNONE __attribute__(( optnone))``
With this we can change libagentthr001.cpp in a platform independent way to
`static void`
`sys_thread_3(jvmtiEnv* jvmti, JNIEnv* jni, void *p) OPTNONE`
`{`
` while (1) {`
` }`
`}`
-------------
Commit messages:
- JDK-8309462
Changes: https://git.openjdk.org/jdk/pull/14330/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=14330&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8309462
Stats: 2 lines in 1 file changed: 2 ins; 0 del; 0 mod
Patch: https://git.openjdk.org/jdk/pull/14330.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/14330/head:pull/14330
PR: https://git.openjdk.org/jdk/pull/14330
More information about the serviceability-dev
mailing list