On Wed, 7 Jun 2023 14:04:14 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) {`
>> `     }`
>> `}`
>
> JoKern65 has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   remove d042520_libagentthr.diff

Marked as reviewed by clanger (Reviewer).

-------------

PR Review: https://git.openjdk.org/jdk/pull/14330#pullrequestreview-1467898282

Reply via email to