1
1
/*
2
- * Copyright (c) 2012, 2023 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2012, 2024 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
@@ -71,7 +71,6 @@ JfrThreadLocal::JfrThreadLocal() :
71
71
_wallclock_time(os::javaTimeNanos()),
72
72
_stackdepth(0 ),
73
73
_entering_suspend_flag(0 ),
74
- _critical_section(0 ),
75
74
_vthread_epoch(0 ),
76
75
_vthread_excluded(false ),
77
76
_jvm_thread_excluded(false ),
@@ -100,6 +99,14 @@ const JfrBlobHandle& JfrThreadLocal::thread_blob() const {
100
99
return _thread;
101
100
}
102
101
102
+ void JfrThreadLocal::initialize_main_thread (JavaThread* jt) {
103
+ assert (jt != nullptr , " invariant" );
104
+ assert (Thread::is_starting_thread (jt), " invariant" );
105
+ assert (jt->threadObj () == nullptr , " invariant" );
106
+ assert (jt->jfr_thread_local ()->_jvm_thread_id == 0 , " invariant" );
107
+ jt->jfr_thread_local ()->_jvm_thread_id = 1 ;
108
+ }
109
+
103
110
static void send_java_thread_start_event (JavaThread* jt) {
104
111
assert (jt != nullptr , " invariant" );
105
112
assert (Thread::current () == jt, " invariant" );
@@ -394,13 +401,13 @@ traceid JfrThreadLocal::thread_id(const Thread* t) {
394
401
if (is_impersonating (t)) {
395
402
return t->jfr_thread_local ()->_thread_id_alias ;
396
403
}
397
- JfrThreadLocal* const tl = t->jfr_thread_local ();
404
+ const JfrThreadLocal* const tl = t->jfr_thread_local ();
398
405
if (!t->is_Java_thread ()) {
399
- return jvm_thread_id (t, tl);
406
+ return jvm_thread_id (tl);
400
407
}
401
408
const JavaThread* jt = JavaThread::cast (t);
402
409
if (!is_vthread (jt)) {
403
- return jvm_thread_id (t, tl);
410
+ return jvm_thread_id (tl);
404
411
}
405
412
// virtual thread
406
413
const traceid tid = vthread_id (jt);
@@ -421,19 +428,30 @@ traceid JfrThreadLocal::external_thread_id(const Thread* t) {
421
428
return JfrRecorder::is_recording () ? thread_id (t) : jvm_thread_id (t);
422
429
}
423
430
424
- inline traceid load_java_thread_id (const Thread* t) {
431
+ static inline traceid load_java_thread_id (const Thread* t) {
425
432
assert (t != nullptr , " invariant" );
426
433
assert (t->is_Java_thread (), " invariant" );
427
434
oop threadObj = JavaThread::cast (t)->threadObj ();
428
435
return threadObj != nullptr ? AccessThreadTraceId::id (threadObj) : 0 ;
429
436
}
430
437
438
+ #ifdef ASSERT
439
+ static bool can_assign (const Thread* t) {
440
+ assert (t != nullptr , " invariant" );
441
+ if (!t->is_Java_thread ()) {
442
+ return true ;
443
+ }
444
+ const JavaThread* jt = JavaThread::cast (t);
445
+ return jt->thread_state () == _thread_new || jt->is_attaching_via_jni ();
446
+ }
447
+ #endif
448
+
431
449
traceid JfrThreadLocal::assign_thread_id (const Thread* t, JfrThreadLocal* tl) {
432
450
assert (t != nullptr , " invariant" );
433
451
assert (tl != nullptr , " invariant" );
434
- JfrSpinlockHelper spinlock (&tl->_critical_section );
435
452
traceid tid = tl->_jvm_thread_id ;
436
453
if (tid == 0 ) {
454
+ assert (can_assign (t), " invariant" );
437
455
if (t->is_Java_thread ()) {
438
456
tid = load_java_thread_id (t);
439
457
tl->_jvm_thread_id = tid;
@@ -446,15 +464,14 @@ traceid JfrThreadLocal::assign_thread_id(const Thread* t, JfrThreadLocal* tl) {
446
464
return tid;
447
465
}
448
466
449
- traceid JfrThreadLocal::jvm_thread_id (const Thread* t, JfrThreadLocal* tl) {
450
- assert (t != nullptr , " invariant" );
467
+ traceid JfrThreadLocal::jvm_thread_id (const JfrThreadLocal* tl) {
451
468
assert (tl != nullptr , " invariant" );
452
- return tl->_jvm_thread_id != 0 ? tl-> _jvm_thread_id : JfrThreadLocal::assign_thread_id (t, tl) ;
469
+ return tl->_jvm_thread_id ;
453
470
}
454
471
455
472
traceid JfrThreadLocal::jvm_thread_id (const Thread* t) {
456
473
assert (t != nullptr , " invariant" );
457
- return jvm_thread_id (t, t ->jfr_thread_local ());
474
+ return jvm_thread_id (t->jfr_thread_local ());
458
475
}
459
476
460
477
bool JfrThreadLocal::is_vthread (const JavaThread* jt) {
0 commit comments