{
const struct sample_event *sample = event;
struct gpu_perf_comm *comm;
+ struct gpu_perf_wait *wait;
comm = lookup_comm(gp, sample->pid);
if (comm == NULL)
return 0;
- comm->wait_begin = sample->time;
+ wait = malloc(sizeof(*wait));
+ if (wait == NULL)
+ return 0;
+
+ wait->seqno = sample->raw[3];
+ wait->time = sample->time;
+ wait->next = comm->wait;
+ comm->wait = wait;
+
return 0;
}
{
const struct sample_event *sample = event;
struct gpu_perf_comm *comm;
+ struct gpu_perf_wait *wait, **prev;
comm = lookup_comm(gp, sample->pid);
if (comm == NULL)
return 0;
- comm->wait_time += sample->time - comm->wait_begin;
+ for (prev = &comm->wait; (wait = *prev) != NULL; prev = &wait->next) {
+ if (wait->seqno != sample->raw[3])
+ continue;
+
+ comm->wait_time += sample->time - wait->time;
+ *prev = wait->next;
+ free(wait);
+ return 1;
+ }
+
return 0;
}
need_comma = true;
}
if (comm->wait_time) {
- if (comm->wait_time > 100) {
+ buf[0] = '\0';
+ if (comm->wait_time > 1000*1000) {
+ sprintf(buf, "%s %.1f ms waiting",
+ need_comma ? "," : "",
+ comm->wait_time / (1000*1000.));
+ } else if (comm->wait_time > 100) {
sprintf(buf, "%s %.1f us waiting",
need_comma ? "," : "",
comm->wait_time / 1000.);
+ } else {
+ sprintf(buf, "%s %.0f ns waiting",
+ need_comma ? "," : "",
+ (double)comm->wait_time);
+ }
+ if (buf[0] != '\0') {
cairo_show_text(ctx->cr, buf);
need_comma = true;
}