--- /dev/null
+//
+// MessagePrinting.cpp
+// msa
+//
+// Created by James McIlree on 2/5/14.
+// Copyright (c) 2014 Apple. All rights reserved.
+//
+
+#include "global.h"
+
+const char* qos_to_string(uint32_t qos) {
+ static_assert(THREAD_QOS_LAST == 7, "QOS tiers need updating");
+
+ switch (qos) {
+ case THREAD_QOS_UNSPECIFIED:
+ return "unspecified";
+
+ case THREAD_QOS_MAINTENANCE:
+ return "maintenance";
+
+ case THREAD_QOS_BACKGROUND:
+ return "background";
+
+ case THREAD_QOS_UTILITY:
+ return "utility";
+
+ case THREAD_QOS_LEGACY:
+ return "legacy";
+
+ case THREAD_QOS_USER_INITIATED:
+ return "user-initiated";
+
+ case THREAD_QOS_USER_INTERACTIVE:
+ return "user-interactive";
+
+ default:
+ ASSERT(false, "Unhandled QoS");
+ return "QOS_???";
+ }
+}
+
+const char* qos_to_short_string(uint32_t qos) {
+ static_assert(THREAD_QOS_LAST == 7, "QOS tiers need updating");
+
+ switch (qos) {
+ case THREAD_QOS_UNSPECIFIED:
+ return "Unspec";
+
+ case THREAD_QOS_MAINTENANCE:
+ return "Maint";
+
+ case THREAD_QOS_BACKGROUND:
+ return "BG";
+
+ case THREAD_QOS_UTILITY:
+ return "Util";
+
+ case THREAD_QOS_LEGACY:
+ return "Legacy";
+
+ case THREAD_QOS_USER_INITIATED:
+ return "UInit";
+
+ case THREAD_QOS_USER_INTERACTIVE:
+ return "UI";
+
+ default:
+ ASSERT(false, "Unhandled QoS");
+ return "???";
+ }
+}
+
+const char* role_to_short_string(uint32_t role) {
+ switch (role) {
+ // This is seen when apps are terminating
+ case TASK_UNSPECIFIED:
+ return "unspec";
+
+ case TASK_FOREGROUND_APPLICATION:
+ return "fg";
+
+ case TASK_BACKGROUND_APPLICATION:
+ return "bg";
+
+ case TASK_CONTROL_APPLICATION:
+ case TASK_GRAPHICS_SERVER:
+ case TASK_THROTTLE_APPLICATION:
+ case TASK_NONUI_APPLICATION:
+ ASSERT(false, "These should be obsolete");
+ return "obsolete";
+
+ case TASK_DEFAULT_APPLICATION:
+ // Is this obsolete too?
+ return "defapp";
+
+ default:
+ ASSERT(false, "Unexpected app role");
+ return "???";
+ }
+}
+
+const char* role_to_string(uint32_t role) {
+ switch (role) {
+ // This is seen when apps are terminating
+ case TASK_UNSPECIFIED:
+ return "unspecified";
+
+ case TASK_FOREGROUND_APPLICATION:
+ return "foreground";
+
+ case TASK_BACKGROUND_APPLICATION:
+ return "background";
+
+ case TASK_CONTROL_APPLICATION:
+ return "control-application";
+
+ case TASK_GRAPHICS_SERVER:
+ return "graphics-server";
+
+ case TASK_THROTTLE_APPLICATION:
+ return "throttle-app";
+
+ case TASK_NONUI_APPLICATION:
+ return "nonui-app";
+
+ case TASK_DEFAULT_APPLICATION:
+ // Is this obsolete too?
+ return "default-app";
+
+ default:
+ ASSERT(false, "Unexpected app role");
+ return "???";
+ }
+}
+
+void print_base_empty(PrintBuffer& buffer,
+ const Globals& globals,
+ uintptr_t event_index,
+ const char* type,
+ bool should_newline)
+{
+ // Base Header is... (32)
+ //
+ // Time(µS) Type Thread ThreadVoucher AppType Process ;;
+ // 123456789abcdef0 1234567890123456789012 1234567890 123456789abcdef0 12345678901234567 123456789012345678901234 12
+ // 14.11 mach_msg_send 18FB voucher-133 AdaptiveDaemon TextEdit (231) ;;
+ // 18.11 mach_msg_recv 18FB 0 InteractiveDaemon configd (19981) ;;
+
+ // Base Header is... (64)
+ //
+ // Time(µS) Type Thread ThreadVoucher AppType Process ;;
+ // 123456789abcdef0 1234567890123456789012 1234567890 123456789abcdef0 12345678901234567 123456789012345678901234 12
+ // 14.11 mach_msg_send 18FB voucher-133 AdaptiveDaemon TextEdit (231) ;;
+ // 18.11 mach_msg_recv 18FB 0 InteractiveDaemon configd (19981) ;;
+
+ //
+ // [Index]
+ //
+ if (globals.should_print_event_index()) {
+ buffer.printf("%8llu ", (uint64_t)event_index);
+ }
+
+ //
+ // Time Type Code Thread ThreadVoucher AppType Process
+ //
+ // This assert doesn't handle utf8...
+ ASSERT(strlen(type) <= 22, "Sanity");
+
+ buffer.printf("%16s %3s %22s %10s %16s %17s %24s ;;", "-", "-", type, "-", "-", "-", "- (-)");
+
+ //
+ // Process
+ //
+ if (should_newline)
+ buffer.printf("\n");
+ else
+ buffer.printf(" ");
+}
+
+static char* print_base_header(char* buf, char* buf_end, const Globals& globals) {
+ // Base Header is... (32)
+ //
+ // Time(µS) Type Thread ThrVoucher Process ;;
+ // 123456789abcdef0 1234567890123456789012 1234567890 123456789a 123456789012345678901234 12
+ // 14.11 mach_msg_send 18FB FFFF8E44 TextEdit (231) ;;
+ // 18.11 mach_msg_recv 18FB 0 configd (19981) ;;
+
+ // Base Header is... (64)
+ //
+ // Time(µS) Type Thread ThreadVoucher Process ;;
+ // 123456789abcdef0 1234567890123456789012 1234567890 123456789abcdef0 123456789012345678901234 12
+ // 14.11 mach_msg_send 18FB BBBBAAEE55778234 TextEdit (231) ;;
+ // 18.11 mach_msg_recv 18FB 0 configd (19981) ;;
+
+ //
+ // If we cannot print successfully, we return the orignal pointer.
+ //
+ char* orig_buf = buf;
+
+ if (globals.should_print_event_index())
+ buf += snprintf(buf, buf_end - buf,"%8s ", "Event#");
+
+ if (buf >= buf_end)
+ return orig_buf;
+
+ // The character counting for "Time(µS)" is OBO, it treats the µ as two characters.
+ // This means the %16s misaligns. We force it by making the input string 16 printable chars long,
+ // which overflows the %16s to the correct actual output length.
+ const char* time = globals.should_print_mach_absolute_timestamps() ? "Time(mach-abs)" : " Time(µS)";
+
+ if (globals.kernel_size() == KernelSize::k32)
+ buf += snprintf(buf, buf_end - buf, "%s %22s %10s %10s %24s ;; ", time, "Type", "Thread", "ThrVoucher", "Process");
+ else
+ buf += snprintf(buf, buf_end - buf, "%s %22s %10s %16s %24s ;; ", time, "Type", "Thread", "ThreadVoucher", "Process");
+
+ return (buf >= buf_end) ? orig_buf : buf;
+}
+
+char* print_mach_msg_header(char* buf, char* buf_end, const Globals& globals) {
+
+ // MachMsg Header is... (32)
+ //
+ // ;; Message From/To MsgID MsgVoucher DeliveryTime FLAGS
+ // 12 123456789012345678901234567 123456789 123456789a 1234567890123 ...
+ // ;; -> configd (19981) 55 - - ONEWAY, IMP-DONATING
+ // ;; <- TextEdit (231) 55 FFFF8E44 120080 VOUCHER-PROVIDED-BY-KERNEL, VOUCHER-REFUSED
+
+ // MachMsg Header is... (64)
+ //
+ // ;; Message From/To MsgID MsgVoucher DeliveryTime FLAGS
+ // 12 123456789012345678901234567 123456789 123456789abcdef0 1234567890123 ...
+ // ;; -> configd (19981) 55 - - ONEWAY, IMP-DONATING
+ // ;; <- TextEdit (231) 55 FFFFAAEE55778234 120080 VOUCHER-PROVIDED-BY-KERNEL, VOUCHER-REFUSED
+
+ char* orig_buf = buf;
+
+ //
+ // Base Header
+ //
+ buf = print_base_header(buf, buf_end, globals);
+
+ if (buf == orig_buf)
+ return orig_buf;
+
+ //
+ // Mach Msg Header
+ //
+ if (globals.kernel_size() == KernelSize::k32)
+ buf += snprintf(buf, buf_end - buf, "%-27s %9s %10s %13s %s\n", "Message-From/To", "MsgID", "MsgVoucher", "DeliveryTime", "FLAGS");
+ else
+ buf += snprintf(buf, buf_end - buf, "%-27s %9s %16s %13s %s\n", "Message-From/To", "MsgID", "MsgVoucher", "DeliveryTime", "FLAGS");
+
+ return (buf >= buf_end) ? orig_buf : buf;
+}