On Wed, May 8, 2013 at 6:03 PM, Umut Tezduyar <u...@tezduyar.com> wrote: > --- > src/analyze/systemd-analyze.c | 42 ++++++++++++++++++++++++++++---- > src/core/dbus-manager.c | 8 ++++++ > src/core/manager.c | 2 + > src/core/manager.h | 2 + > 4 files changed, 48 insertions(+), 6 deletions(-) > > diff --git a/src/analyze/systemd-analyze.c b/src/analyze/systemd-analyze.c > index bb86ec7..df3d307 100644 > --- a/src/analyze/systemd-analyze.c > +++ b/src/analyze/systemd-analyze.c > @@ -78,6 +78,8 @@ struct boot_times { > usec_t initrd_time; > usec_t userspace_time; > usec_t finish_time; > + usec_t generators_start_time; > + usec_t generators_finish_time; > }; > struct unit_times { > char *name; > @@ -303,7 +305,17 @@ static int acquire_boot_times(DBusConnection *bus, > struct boot_times **bt) { > "/org/freedesktop/systemd1", > "org.freedesktop.systemd1.Manager", > "FinishTimestampMonotonic", > - ×.finish_time) < 0) > + ×.finish_time) < 0 || > + bus_get_uint64_property(bus, > + "/org/freedesktop/systemd1", > + "org.freedesktop.systemd1.Manager", > + "GeneratorsStartTimestampMonotonic", > + ×.generators_start_time) < 0 || > + bus_get_uint64_property(bus, > + "/org/freedesktop/systemd1", > + "org.freedesktop.systemd1.Manager", > + "GeneratorsFinishTimestampMonotonic", > + ×.generators_finish_time) < 0) > return -EIO; > > if (times.finish_time <= 0) { > @@ -459,7 +471,8 @@ static int analyze_plot(DBusConnection *bus) { > > svg("<svg width=\"%.0fpx\" height=\"%.0fpx\" version=\"1.1\" " > "xmlns=\"http://www.w3.org/2000/svg\">\n\n", > - 80.0 + width, 150.0 + (m * SCALE_Y)); > + 80.0 + width, 150.0 + (m * SCALE_Y) + > + 4 * SCALE_Y /* legend */); > > /* write some basic info as a comment, including some help */ > svg("<!-- This file is a systemd-analyze SVG file. It is best > rendered in a -->\n" > @@ -480,6 +493,7 @@ static int analyze_plot(DBusConnection *bus) { > " rect.firmware { fill: rgb(150,150,150); fill-opacity: > 0.7; }\n" > " rect.loader { fill: rgb(150,150,150); fill-opacity: > 0.7; }\n" > " rect.userspace { fill: rgb(150,150,150); fill-opacity: > 0.7; }\n" > + " rect.generators { fill: rgb(102,204,255); fill-opacity: > 0.7; }\n" > " rect.box { fill: rgb(240,240,240); stroke: > rgb(192,192,192); }\n" > " line { stroke: rgb(64,64,64); stroke-width: 1; }\n" > "// line.sec1 { }\n" > @@ -495,8 +509,6 @@ static int analyze_plot(DBusConnection *bus) { > svg("<text x=\"20\" y=\"30\">%s %s (%s %s) %s</text>", > isempty(osname) ? "Linux" : osname, > name.nodename, name.release, name.version, name.machine); > - svg("<text x=\"20\" y=\"%.0f\">Legend: Red = Activating; Pink = > Active; Dark Pink = Deactivating</text>", > - 120.0 + (m *SCALE_Y)); > > svg("<g transform=\"translate(%.3f,100)\">\n", 20.0 + (SCALE_X * > boot->firmware_time)); > svg_graph_box(m, -boot->firmware_time, boot->finish_time); > @@ -521,8 +533,9 @@ static int analyze_plot(DBusConnection *bus) { > svg_text(true, boot->initrd_time, y, "initrd"); > y++; > } > - svg_bar("userspace", boot->userspace_time, boot->finish_time, y); > - svg_text("left", boot->userspace_time, y, "userspace"); > + svg_bar("active", boot->userspace_time, boot->finish_time, y); > + svg_bar("generators", boot->generators_start_time, > boot->generators_finish_time, y); > + svg_text("left", boot->userspace_time, y, "systemd"); > y++; > > for (u = times; u < times + n; u++) { > @@ -544,6 +557,23 @@ static int analyze_plot(DBusConnection *bus) { > svg_text(b, u->ixt, y, "%s", u->name); > y++; > } > + > + /* Legend */ > + y++; > + svg_bar("activating", 0, 300000, y); > + svg_text("right", 400000, y, "Activating"); > + y++; > + svg_bar("active", 0, 300000, y); > + svg_text("right", 400000, y, "Active"); > + y++; > + svg_bar("deactivating", 0, 300000, y); > + svg_text("right", 400000, y, "Deactivating"); > + y++; > + svg_bar("generators", 0, 300000, y); > + svg_text("right", 400000, y, "Generators"); > + y++; > + > + It would be nice to see a full screenshot that includes the new legend area.
> svg("</g>\n\n"); > > svg("</svg>"); > diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c > index 56b02a1..c932437 100644 > --- a/src/core/dbus-manager.c > +++ b/src/core/dbus-manager.c > @@ -275,6 +275,10 @@ > " <property name=\"UserspaceTimestampMonotonic\" type=\"t\" > access=\"read\"/>\n" \ > " <property name=\"FinishTimestamp\" type=\"t\" > access=\"read\"/>\n" \ > " <property name=\"FinishTimestampMonotonic\" type=\"t\" > access=\"read\"/>\n" \ > + " <property name=\"GeneratorsStartTimestamp\" type=\"t\" > access=\"read\"/>\n" \ > + " <property name=\"GeneratorsStartTimestampMonotonic\" type=\"t\" > access=\"read\"/>\n" \ > + " <property name=\"GeneratorsFinishTimestamp\" type=\"t\" > access=\"read\"/>\n" \ > + " <property name=\"GeneratorsFinishTimestampMonotonic\" type=\"t\" > access=\"read\"/>\n" \ > " <property name=\"LogLevel\" type=\"s\" access=\"readwrite\"/>\n" > \ > " <property name=\"LogTarget\" type=\"s\" access=\"readwrite\"/>\n" > \ > " <property name=\"NNames\" type=\"u\" access=\"read\"/>\n" \ > @@ -580,6 +584,10 @@ static const BusProperty bus_manager_properties[] = { > { "UserspaceTimestampMonotonic", bus_property_append_uint64, > "t", offsetof(Manager, userspace_timestamp.monotonic) }, > { "FinishTimestamp", bus_property_append_uint64, > "t", offsetof(Manager, finish_timestamp.realtime) }, > { "FinishTimestampMonotonic", bus_property_append_uint64, > "t", offsetof(Manager, finish_timestamp.monotonic) }, > + { "GeneratorsStartTimestamp", bus_property_append_uint64, > "t", offsetof(Manager, generators_start_timestamp.realtime) }, > + { "GeneratorsStartTimestampMonotonic", bus_property_append_uint64, > "t", offsetof(Manager, generators_start_timestamp.monotonic) }, > + { "GeneratorsFinishTimestamp", bus_property_append_uint64, > "t", offsetof(Manager, generators_finish_timestamp.realtime) }, > + { "GeneratorsFinishTimestampMonotonic", bus_property_append_uint64, > "t", offsetof(Manager, generators_finish_timestamp.monotonic) }, > { "LogLevel", bus_manager_append_log_level, > "s", 0, false, > bus_manager_set_log_level }, > { "LogTarget", bus_manager_append_log_target, > "s", 0, false, > bus_manager_set_log_target }, > { "NNames", bus_manager_append_n_names, > "u", 0 }, > diff --git a/src/core/manager.c b/src/core/manager.c > index c7f8f20..7b7ace6 100644 > --- a/src/core/manager.c > +++ b/src/core/manager.c > @@ -2525,7 +2525,9 @@ void manager_run_generators(Manager *m) { > argv[4] = NULL; > > RUN_WITH_UMASK(0022) { > + dual_timestamp_get(&m->generators_start_timestamp); > execute_directory(generator_path, d, (char**) argv); > + dual_timestamp_get(&m->generators_finish_timestamp); > } The timestamps can be overwritten later as this is also called from manager_reload. You cancheck with dual_timestamp_is_set to avoid that. Or simply move the timestamps out into manager_startup. This will make them also include the create/trim of the generator directories. This might make sense if we are trying to find the total time cost of the generators. > trim_generator_dir(m, &m->generator_unit_path); > diff --git a/src/core/manager.h b/src/core/manager.h > index bf83354..5d777e6 100644 > --- a/src/core/manager.h > +++ b/src/core/manager.h > @@ -150,6 +150,8 @@ struct Manager { > dual_timestamp initrd_timestamp; > dual_timestamp userspace_timestamp; > dual_timestamp finish_timestamp; > + dual_timestamp generators_start_timestamp; > + dual_timestamp generators_finish_timestamp; > > char *generator_unit_path; > char *generator_unit_path_early; > -- > 1.7.2.5 > > _______________________________________________ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/systemd-devel _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel