On Wed, 4 Jun 2025 14:52:04 GMT, Johannes Bechberger <jbechber...@openjdk.org> wrote:
>> Why would we be accessing invalid memory? > > Which differences to the example code are you seeing? > > > sev.sigev_notify = SIGEV_SIGNAL; > sev.sigev_signo = SIG; > sev.sigev_value.sival_ptr = &timerid; > if (timer_create(CLOCKID, &sev, &timerid) == -1) > errExit("timer_create"); > > printf("timer ID is %#jx\n", (uintmax_t) timerid); > > /* Start the timer. */ > > freq_nanosecs = atoll(argv[2]); > its.it_value.tv_sec = freq_nanosecs / 1000000000; > its.it_value.tv_nsec = freq_nanosecs % 1000000000; > its.it_interval.tv_sec = its.it_value.tv_sec; > its.it_interval.tv_nsec = its.it_value.tv_nsec; > > > > Is similar to: > > > ((int*)&sev.sigev_notify)[1] = thread->osthread()->thread_id(); > clockid_t clock; > int err = pthread_getcpuclockid(thread->osthread()->pthread_id(), &clock); > if (err != 0) { > log_error(jfr)("Failed to get clock for thread sampling: %s", > os::strerror(err)); > return false; > } > if (timer_create(clock, &sev, &t) < 0) { > return false; > } > int64_t period = get_sampling_period(); > if (period != 0) { > set_timer_time(t, period); > } The `sigev_value` member is used to pass data that you can read in the signal handler. The address of `t` won't be valid anymore once you return from this function. In that example the address of `timerid ` is still valid. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/25302#discussion_r2126817165