Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8309462

[AIX] vmTestbase/nsk/jvmti/RunAgentThread/agentthr001/TestDescription.java crashing due to empty while loop

    XMLWordPrintable

Details

    • 21
    • b27
    • ppc
    • aix

    Backports

      Description

        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) {
             }
        }

        Attachments

          Issue Links

            Activity

              People

                jkern Joachim Kern
                jkern Joachim Kern
                Votes:
                0 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved: