@@ -72,6 +72,7 @@ static struct perf_top top = {
72
72
.target_tid = -1 ,
73
73
.active_symbols = LIST_HEAD_INIT (top .active_symbols ),
74
74
.active_symbols_lock = PTHREAD_MUTEX_INITIALIZER ,
75
+ .active_symbols_cond = PTHREAD_COND_INITIALIZER ,
75
76
.freq = 1000 , /* 1 KHz */
76
77
};
77
78
@@ -577,7 +578,17 @@ static void handle_keypress(struct perf_session *session, int c)
577
578
578
579
static void * display_thread_tui (void * arg __used )
579
580
{
580
- perf_top__tui_browser (& top );
581
+ int err = 0 ;
582
+ pthread_mutex_lock (& top .active_symbols_lock );
583
+ while (list_empty (& top .active_symbols )) {
584
+ err = pthread_cond_wait (& top .active_symbols_cond ,
585
+ & top .active_symbols_lock );
586
+ if (err )
587
+ break ;
588
+ }
589
+ pthread_mutex_unlock (& top .active_symbols_lock );
590
+ if (!err )
591
+ perf_top__tui_browser (& top );
581
592
exit_browser (0 );
582
593
exit (0 );
583
594
return NULL ;
@@ -776,8 +787,14 @@ static void perf_event__process_sample(const union perf_event *event,
776
787
syme -> count [evsel -> idx ]++ ;
777
788
record_precise_ip (syme , evsel -> idx , ip );
778
789
pthread_mutex_lock (& top .active_symbols_lock );
779
- if (list_empty (& syme -> node ) || !syme -> node .next )
790
+ if (list_empty (& syme -> node ) || !syme -> node .next ) {
791
+ static bool first = true;
780
792
__list_insert_active_sym (syme );
793
+ if (first ) {
794
+ pthread_cond_broadcast (& top .active_symbols_cond );
795
+ first = false;
796
+ }
797
+ }
781
798
pthread_mutex_unlock (& top .active_symbols_lock );
782
799
}
783
800
}
0 commit comments