On Tue, 6 Jun 2023 09:51:09 GMT, JoKern65 <d...@openjdk.org> wrote: > 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) {` > ` }` > `}`
The solution to use sleep looks fine. Please address the comments and also update the copyright year. test/hotspot/jtreg/vmTestbase/nsk/jvmti/RunAgentThread/agentthr001/agentthr001.cpp line 141: > 139: sys_thread_3(jvmtiEnv* jvmti, JNIEnv* jni, void *p) { > 140: while (1) { > 141: sleep(1); Maybe you could add a comment here that the call to sleep is necessary to avoid the compiler optimization to elide the loop. ------------- Changes requested by clanger (Reviewer). PR Review: https://git.openjdk.org/jdk/pull/14330#pullrequestreview-1466167108 PR Review Comment: https://git.openjdk.org/jdk/pull/14330#discussion_r1220417459