[Cogl] [PATCH] profile: Print warning if "Mainloop" timer missing

Robert Bragg robert at sixbynine.org
Tue Aug 28 08:51:16 PDT 2012


From: Robert Bragg <robert at linux.intel.com>

As a helpful aid Cogl will now print a warning if no "Mainloop" UProf
timer was setup by the application that explains that either Clutter
should be built with --enable-profile or if Clutter isn't being used
then it shows how it can create its own Mainloop timer.
---
 cogl/cogl-profile.c |   44 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 43 insertions(+), 1 deletions(-)

diff --git a/cogl/cogl-profile.c b/cogl/cogl-profile.c
index f552b63..042fb78 100644
--- a/cogl/cogl-profile.c
+++ b/cogl/cogl-profile.c
@@ -35,7 +35,48 @@ print_exit_report (void)
 {
   if (getenv ("COGL_PROFILE_OUTPUT_REPORT"))
     {
-      UProfReport *report = uprof_report_new ("Cogl report");
+      UProfContext *mainloop_context;
+      UProfTimerResult *mainloop_timer;
+      UProfReport *report;
+
+      /* NB: uprof provides a shared context for mainloop statistics
+       * which needs to be setup by the application which controls the
+       * mainloop.
+       *
+       * If no "Mainloop" timer has been setup then we print a warning
+       * since we can't provide a meaningful Cogl report without one.
+       */
+      mainloop_context = uprof_get_mainloop_context ();
+      mainloop_timer = uprof_context_get_timer_result (mainloop_context,
+                                                       "Mainloop");
+      /* just bail out if the mainloop timer wasn't hit */
+      if (!mainloop_timer)
+        {
+          g_warning ("\n\n"
+                     "No UProf \"Mainloop\" timer was setup by the "
+                     "application therefore we\ncan't provide a meaningful "
+                     "profile report.\n"
+                     "\n"
+                     "This should be done automatically if you are using Clutter "
+                     "(if\nbuilt with --enable-profile)\n"
+                     "\n"
+                     "If you aren't using Clutter then you can declare a "
+                     "\"Mainloop\" UProf\ntimer in your application like this:\n\n"
+                     "  UPROF_STATIC_TIMER (mainloop_timer, \n"
+                     "                      NULL,\n"
+                     "                      \"Mainloop\",\n"
+                     "                      \"Time in glib mainloop\",\n"
+                     "                      0);\n"
+                     "\n"
+                     "And start/stop it around your mainloop like this:\n"
+                     "\n"
+                     "  UPROF_TIMER_START (uprof_get_mainloop_context (), mainloop_timer);\n"
+                     "  g_main_loop_run (loop);\n"
+                     "  UPROF_TIMER_STOP (uprof_get_mainloop_context (), mainloop_timer);\n");
+          return;
+        }
+
+      report = uprof_report_new ("Cogl report");
       uprof_report_add_context (report, _cogl_uprof_context);
       uprof_report_print (report);
       uprof_report_unref (report);
@@ -47,6 +88,7 @@ void
 _cogl_uprof_init (void)
 {
   _cogl_uprof_context = uprof_context_new ("Cogl");
+  uprof_context_link (_cogl_uprof_context, uprof_get_mainloop_context ());
 #define OPT(MASK_NAME, GROUP, NAME, NAME_FORMATTED, DESCRIPTION) \
   G_STMT_START { \
     int shift = COGL_DEBUG_ ## MASK_NAME; \
-- 
1.7.7.6



More information about the Cogl mailing list