RFR: JDK-8309462: vmTestbase/nsk/jvmti/RunAgentThread/agentthr001/TestDescription.java crashing due to empty while loop [v2]
JoKern65
duke at openjdk.org
Wed Jun 7 14:01:33 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) {`
> ` }`
> `}`
JoKern65 has updated the pull request incrementally with one additional commit since the last revision:
switched to solution two
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/14330/files
- new: https://git.openjdk.org/jdk/pull/14330/files/ae0d67ae..e44edba6
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=14330&range=01
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=14330&range=00-01
Stats: 32 lines in 2 files changed: 29 ins; 1 del; 2 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