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