Futures visualizer - show name of jitted function for on_demand events

This commit is contained in:
James Swaine 2012-07-01 20:43:49 -05:00
parent 7972adc97a
commit 39f42b753d
3 changed files with 69 additions and 53 deletions

View File

@ -20,6 +20,9 @@
organize-output organize-output
build-trace build-trace
event-has-duration? event-has-duration?
touch-event?
allocation-event?
jitcompile-event?
final-event? final-event?
relative-time) relative-time)
@ -107,6 +110,16 @@
[(start-work start-0-work) #t] [(start-work start-0-work) #t]
[else #f])) [else #f]))
(define (touch-event? evt)
(equal? (event-prim-name evt) 'touch))
;;allocation-event? : event -> bool
(define (allocation-event? evt)
(equal? (event-prim-name evt) '|[allocate memory|))
(define (jitcompile-event? evt)
(equal? (event-prim-name evt) '|[jit_on_demand]|))
;;final-event? : event -> bool ;;final-event? : event -> bool
(define (final-event? evt) (define (final-event? evt)
(case (event-timeline-position evt) (case (event-timeline-position evt)

View File

@ -59,10 +59,12 @@
[(block sync) [(block sync)
(when (= (event-proc-id evt) RT-THREAD-ID) (when (= (event-proc-id evt) RT-THREAD-ID)
(send data-label1 set-label (format "Primitive: ~a" (symbol->string (event-prim-name evt))))) (send data-label1 set-label (format "Primitive: ~a" (symbol->string (event-prim-name evt)))))
(when (equal? (event-prim-name evt) 'touch) (define label2-txt (cond
(send data-label2 set-label (format "Touching future ~a" (event-user-data evt)))) [(touch-event? evt) (format "Touching future ~a" (event-user-data evt))]
(when (equal? (event-prim-name evt) (string->symbol "[allocate memory]")) [(allocation-event? evt) (format "Size: ~a" (event-user-data evt))]
(send data-label2 set-label (format "Size: ~a" (event-user-data evt))))] [(jitcompile-event? evt) (format "Jitting: ~a" (event-user-data evt))]
[else ""]))
(send data-label2 set-label label2-txt)]
[(create) [(create)
(send data-label1 set-label (format "Creating future ~a" (event-user-data evt)))] (send data-label1 set-label (format "Creating future ~a" (event-user-data evt)))]
[(touch) [(touch)

View File

@ -1061,14 +1061,14 @@ static void end_traversal(Fevent_Buffer *b)
b->pos = 0; b->pos = 0;
} }
static void log_future_event_with_data(Scheme_Future_State *fs, static void log_future_event(Scheme_Future_State *fs,
const char *msg_str, const char *msg_str,
const char *extra_str, const char *extra_str,
int which, int which,
int what, int what,
double timestamp, double timestamp,
int fid, int fid,
int user_data) Scheme_Object *user_data)
{ {
Scheme_Object *data, *v; Scheme_Object *data, *v;
@ -1093,7 +1093,10 @@ static void log_future_event_with_data(Scheme_Future_State *fs,
((Scheme_Structure *)data)->slots[4] = scheme_false; ((Scheme_Structure *)data)->slots[4] = scheme_false;
/* User data (target fid for creates, alloc amount for allocation */ /* User data (target fid for creates, alloc amount for allocation */
((Scheme_Structure *)data)->slots[5] = scheme_make_integer(user_data); if (!user_data)
user_data = scheme_false;
((Scheme_Structure *)data)->slots[5] = user_data;
scheme_log_w_data(scheme_main_logger, SCHEME_LOG_DEBUG, 0, scheme_log_w_data(scheme_main_logger, SCHEME_LOG_DEBUG, 0,
data, data,
@ -1106,24 +1109,6 @@ static void log_future_event_with_data(Scheme_Future_State *fs,
} }
static void log_future_event(Scheme_Future_State *fs,
const char *msg_str,
const char *extra_str,
int which,
int what,
double timestamp,
int fid)
{
log_future_event_with_data(fs,
msg_str,
extra_str,
which,
what,
timestamp,
fid,
0);
}
static void log_overflow_event(Scheme_Future_State *fs, int which, double timestamp) static void log_overflow_event(Scheme_Future_State *fs, int which, double timestamp)
{ {
log_future_event(fs, log_future_event(fs,
@ -1132,7 +1117,8 @@ static void log_overflow_event(Scheme_Future_State *fs, int which, double timest
which, which,
FEVENT_MISSING, FEVENT_MISSING,
timestamp, timestamp,
0); 0,
NULL);
} }
static void flush_future_logs(Scheme_Future_State *fs) static void flush_future_logs(Scheme_Future_State *fs)
@ -1141,6 +1127,7 @@ static void flush_future_logs(Scheme_Future_State *fs)
double t, min_t; double t, min_t;
int i, min_which, min_set; int i, min_which, min_set;
Fevent_Buffer *b, *min_b; Fevent_Buffer *b, *min_b;
Scheme_Object *data_val;
if (scheme_log_level_p(scheme_main_logger, SCHEME_LOG_DEBUG)) { if (scheme_log_level_p(scheme_main_logger, SCHEME_LOG_DEBUG)) {
/* Hold lock while swapping buffers: */ /* Hold lock while swapping buffers: */
@ -1209,14 +1196,15 @@ static void flush_future_logs(Scheme_Future_State *fs)
if (!min_b) if (!min_b)
break; break;
log_future_event_with_data(fs, data_val = scheme_make_integer(min_b->a[min_b->i].data);
log_future_event(fs,
"future %d, process %d: %s%s; time: %f", "future %d, process %d: %s%s; time: %f",
"", "",
min_which, min_which,
min_b->a[min_b->i].what, min_b->a[min_b->i].what,
min_b->a[min_b->i].timestamp, min_b->a[min_b->i].timestamp,
min_b->a[min_b->i].fid, min_b->a[min_b->i].fid,
min_b->a[min_b->i].data); data_val);
--min_b->count; --min_b->count;
min_b->i++; min_b->i++;
@ -2084,14 +2072,16 @@ Scheme_Object *touch(int argc, Scheme_Object *argv[])
&& ft->in_tracing_mode) { && ft->in_tracing_mode) {
targ_ft = (future_t*)argv[0]; targ_ft = (future_t*)argv[0];
Scheme_Future_State *fs = scheme_future_state; Scheme_Future_State *fs = scheme_future_state;
log_future_event_with_data( fs, Scheme_Object *targid_obj;
"future %d, process %d: %s: %s; time: %f", targid_obj = scheme_make_integer(targ_ft->id);
"touch", log_future_event(fs,
-1, "future %d, process %d: %s: %s; time: %f",
FEVENT_RTCALL_TOUCH, "touch",
get_future_timestamp(), -1,
ft->id, FEVENT_RTCALL_TOUCH,
targ_ft->id); get_future_timestamp(),
ft->id,
targid_obj);
} }
return general_touch(argc, argv); return general_touch(argc, argv);
@ -3346,6 +3336,7 @@ static void do_invoke_rtcall(Scheme_Future_State *fs, future_t *future)
if (scheme_log_level_p(scheme_main_logger, SCHEME_LOG_DEBUG)) { if (scheme_log_level_p(scheme_main_logger, SCHEME_LOG_DEBUG)) {
const char *src; const char *src;
Scheme_Object *userdata;
src = future->source_of_request; src = future->source_of_request;
if (future->source_type == FSRC_RATOR) { if (future->source_type == FSRC_RATOR) {
@ -3365,24 +3356,35 @@ static void do_invoke_rtcall(Scheme_Future_State *fs, future_t *future)
flush_future_logs(fs); flush_future_logs(fs);
/* use lg_future_event so we can include `str' in the message: */ /* use lg_future_event so we can include `str' in the message: */
if (future->prim_protocol == SIG_ALLOC) { userdata = NULL;
log_future_event_with_data(fs, switch (future->prim_protocol)
"future %d, process %d: %s: %s; time: %f", {
src, case SIG_ALLOC:
-1, {
(future->rt_prim_is_atomic ? FEVENT_HANDLE_RTCALL_ATOMIC : FEVENT_HANDLE_RTCALL), userdata = scheme_make_integer(future->arg_i0);
get_future_timestamp(), break;
future->id, }
future->arg_i0); case SIG_ON_DEMAND:
} else { {
log_future_event(fs, /* Closure is first in runstack */
GC_CAN_IGNORE Scheme_Object **rs = future->arg_S0;
ADJUST_RS_ARG(future, rs);
userdata = scheme_object_name(rs[0]);
if (!userdata)
userdata = scheme_intern_symbol("[unknown]");
break;
}
}
log_future_event(fs,
"future %d, process %d: %s: %s; time: %f", "future %d, process %d: %s: %s; time: %f",
src, src,
-1, -1,
(future->rt_prim_is_atomic ? FEVENT_HANDLE_RTCALL_ATOMIC : FEVENT_HANDLE_RTCALL), (future->rt_prim_is_atomic ? FEVENT_HANDLE_RTCALL_ATOMIC : FEVENT_HANDLE_RTCALL),
get_future_timestamp(), get_future_timestamp(),
future->id); future->id,
} userdata);
} }
if (((future->source_type == FSRC_RATOR) if (((future->source_type == FSRC_RATOR)
@ -3398,7 +3400,6 @@ static void do_invoke_rtcall(Scheme_Future_State *fs, future_t *future)
case SIG_ON_DEMAND: case SIG_ON_DEMAND:
{ {
GC_CAN_IGNORE Scheme_Object **arg_S0 = future->arg_S0; GC_CAN_IGNORE Scheme_Object **arg_S0 = future->arg_S0;
future->arg_S0 = NULL; future->arg_S0 = NULL;
ADJUST_RS_ARG(future, arg_S0); ADJUST_RS_ARG(future, arg_S0);