@@ -196,7 +196,7 @@ static void add_mutex(Mutex* var) {
196
196
assert (_num_mutex < MAX_NUM_MUTEX, " increase MAX_NUM_MUTEX" );
197
197
int id = _num_mutex++;
198
198
_mutex_array[id] = var;
199
- var->set_id (id);
199
+ // var->set_id(id);
200
200
}
201
201
202
202
#define MUTEX_STORAGE_NAME (name ) name##_storage
@@ -393,6 +393,11 @@ void mutex_init() {
393
393
#undef MUTEX_STORAGE
394
394
#undef MUTEX_STORAGE_NAME
395
395
396
+ static const int MAX_NAMES = 200 ;
397
+ static const char * _names[MAX_NAMES] = { nullptr };
398
+ static bool _is_unique[MAX_NAMES] = { false };
399
+ static int _num_names = 0 ;
400
+
396
401
PerfCounter** MutexLockerImpl::_perf_lock_count = nullptr ;
397
402
PerfCounter** MutexLockerImpl::_perf_lock_wait_time = nullptr ;
398
403
PerfCounter** MutexLockerImpl::_perf_lock_hold_time = nullptr ;
@@ -401,28 +406,54 @@ void MutexLockerImpl::init_counters() {
401
406
if (ProfileVMLocks && UsePerfData) {
402
407
ResourceMark rm;
403
408
EXCEPTION_MARK;
404
- _perf_lock_count = NEW_C_HEAP_ARRAY (PerfCounter*, _num_mutex + 1 , mtInternal);
405
- _perf_lock_wait_time = NEW_C_HEAP_ARRAY (PerfCounter*, _num_mutex + 1 , mtInternal);
406
- _perf_lock_hold_time = NEW_C_HEAP_ARRAY (PerfCounter*, _num_mutex + 1 , mtInternal);
409
+ _perf_lock_count = NEW_C_HEAP_ARRAY (PerfCounter*, MAX_NAMES + 1 , mtInternal);
410
+ _perf_lock_wait_time = NEW_C_HEAP_ARRAY (PerfCounter*, MAX_NAMES + 1 , mtInternal);
411
+ _perf_lock_hold_time = NEW_C_HEAP_ARRAY (PerfCounter*, MAX_NAMES + 1 , mtInternal);
407
412
408
413
NEWPERFEVENTCOUNTER (_perf_lock_count[0 ], SUN_RT, PerfDataManager::counter_name (" Other" , " Count" ));
409
414
NEWPERFEVENTCOUNTER (_perf_lock_wait_time[0 ], SUN_RT, PerfDataManager::counter_name (" Other" , " BeforeTime" ));
410
415
NEWPERFEVENTCOUNTER (_perf_lock_hold_time[0 ], SUN_RT, PerfDataManager::counter_name (" Other" , " AfterTime" ));
411
- for (int i = 0 ; i < _num_mutex; i++) {
412
- NEWPERFEVENTCOUNTER (_perf_lock_count[i+1 ], SUN_RT, PerfDataManager::counter_name (_mutex_array[i]->name (), " Count" ));
413
- NEWPERFEVENTCOUNTER (_perf_lock_wait_time[i + 1 ], SUN_RT, PerfDataManager::counter_name (_mutex_array[i]->name (), " BeforeTime" ));
414
- NEWPERFEVENTCOUNTER (_perf_lock_hold_time[i + 1 ], SUN_RT, PerfDataManager::counter_name (_mutex_array[i]->name (), " AfterTime" ));
416
+ for (int i = 0 ; i < MAX_NAMES; i++) {
417
+ ResourceMark rm;
418
+ const char * counter_name = _names[i];
419
+ if (counter_name == nullptr ) {
420
+ stringStream ss;
421
+ ss.print (" UnnamedMutex#%d" , i);
422
+ counter_name = ss.as_string ();
423
+ }
424
+ NEWPERFEVENTCOUNTER (_perf_lock_count[i + 1 ], SUN_RT, PerfDataManager::counter_name (counter_name, " Count" ));
425
+ NEWPERFEVENTCOUNTER (_perf_lock_wait_time[i + 1 ], SUN_RT, PerfDataManager::counter_name (counter_name, " BeforeTime" ));
426
+ NEWPERFEVENTCOUNTER (_perf_lock_hold_time[i + 1 ], SUN_RT, PerfDataManager::counter_name (counter_name, " AfterTime" ));
415
427
}
416
428
if (HAS_PENDING_EXCEPTION) {
417
429
vm_exit_during_initialization (" MutexLockerImpl::init_counters() failed unexpectedly" );
418
430
}
419
431
}
420
432
}
421
433
422
- void MutexLockerImpl::print_counter_on (outputStream* st, const char * name, int idx) {
434
+ int MutexLockerImpl::name2id (const char * name) {
435
+ if (ProfileVMLocks && UsePerfData) {
436
+ for (int i = 0 ; i < _num_names; i++) {
437
+ if (strcmp (_names[i], name) == 0 ) {
438
+ _is_unique[i] = false ;
439
+ return i;
440
+ }
441
+ }
442
+ if (_num_names < MAX_NAMES) {
443
+ int new_id = _num_names++;
444
+ _names[new_id] = os::strdup (name, mtInternal);
445
+ _is_unique[new_id] = true ;
446
+ return new_id;
447
+ }
448
+ log_debug (init)(" Unnamed: %s" , name); // no slots left
449
+ }
450
+ return -1 ;
451
+ }
452
+
453
+ void MutexLockerImpl::print_counter_on (outputStream* st, const char * name, bool is_unique, int idx) {
423
454
jlong count = _perf_lock_count[idx]->get_value ();
424
455
if (count > 0 ) {
425
- st->print_cr (" %3d: %32s = %5ldms (%5ldms) / %9ld events" , idx, name,
456
+ st->print_cr (" %3d: %s%40s = %5ldms (%5ldms) / %9ld events" , idx, (is_unique ? " " : " M " ) , name,
426
457
Management::ticks_to_ms (_perf_lock_hold_time[idx]->get_value ()),
427
458
Management::ticks_to_ms (_perf_lock_wait_time[idx]->get_value ()),
428
459
count);
@@ -431,7 +462,10 @@ void MutexLockerImpl::print_counter_on(outputStream* st, const char* name, int i
431
462
432
463
static jlong accumulate_lock_counters (PerfCounter** lock_counters) {
433
464
jlong acc = 0 ;
434
- for (int i = 0 ; i < _num_mutex + 1 ; i++) { // 0 slot is reserved for unnamed locks
465
+ for (int i = 0 ; i < _num_names + 1 ; i++) { // 0 slot is reserved for unnamed locks
466
+ if (lock_counters[i] == nullptr ) {
467
+ break ;
468
+ }
435
469
acc += lock_counters[i]->get_value ();
436
470
}
437
471
return acc;
@@ -443,14 +477,15 @@ void MutexLockerImpl::print_counters_on(outputStream* st) {
443
477
jlong total_wait_time = accumulate_lock_counters (_perf_lock_wait_time);
444
478
jlong total_hold_time = accumulate_lock_counters (_perf_lock_hold_time);
445
479
446
- st->print_cr (" MutexLocker: Total: hold = %ldms (wait = %ldms) / %ld events for thread \" main\" " ,
480
+ st->print_cr (" MutexLocker: Total: %d named locks (%d unique names); hold = %ldms (wait = %ldms) / %ld events for thread \" main\" " ,
481
+ _num_mutex, _num_names,
447
482
Management::ticks_to_ms (total_hold_time),
448
483
Management::ticks_to_ms (total_wait_time),
449
484
total_count);
450
- for (int i = 0 ; i < _num_mutex ; i++) {
451
- print_counter_on (st, _mutex_array [i]-> name () , i+1 );
485
+ for (int i = 0 ; i < _num_names ; i++) {
486
+ print_counter_on (st, _names [i], _is_unique[i] , i+1 );
452
487
}
453
- print_counter_on (st, " Unnamed / Other" , 0 );
488
+ print_counter_on (st, " Unnamed / Other" , false /* is_unique */ , 0 );
454
489
} else {
455
490
st->print_cr (" MutexLocker: no info (%s is disabled)" , (UsePerfData ? " ProfileVMLocks" : " UsePerfData" ));
456
491
}
0 commit comments