+2008-07-27 Carlos Garcia Campos <carlosgc@gnome.org>
+
+ * libdocument/ev-debug.[ch]: (ev_profiler_start),
+ (ev_profiler_stop):
+ * shell/ev-jobs.c: (ev_job_finished), (ev_job_links_run),
+ (notify_page_ready), (ev_job_render_run), (ev_job_thumbnail_run),
+ (ev_job_fonts_run), (ev_job_load_run), (ev_job_save_run),
+ (ev_job_print_run):
+ * shell/main.c: (main):
+
+ Add a profile mode available when debug is enabled. Add profilers
+ in ev-jobs.
+
2008-07-23 Götz Waschk <waschk@mandriva.org>
* configure.ac: Correctly build desktop file. Fixes
#ifdef EV_ENABLE_DEBUG
static EvDebugSection ev_debug = EV_NO_DEBUG;
+static EvProfileSection ev_profile = EV_NO_PROFILE;
-void
-ev_debug_init ()
+static GHashTable *timers = NULL;
+
+static void
+debug_init ()
{
if (g_getenv ("EV_DEBUG") != NULL) {
/* enable all debugging */
ev_debug |= EV_DEBUG_JOBS;
}
+static void
+profile_init ()
+{
+ if (g_getenv ("EV_PROFILE") != NULL) {
+ /* enable all profiling */
+ ev_profile = ~EV_NO_PROFILE;
+ return;
+ }
+
+ if (g_getenv ("EV_PROFILE_JOBS") != NULL)
+ ev_profile |= EV_PROFILE_JOBS;
+
+ if (ev_profile) {
+ timers = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) g_timer_destroy);
+ }
+}
+
+void
+ev_debug_init ()
+{
+ debug_init ();
+ profile_init ();
+}
+
+void
+ev_debug_shutdown ()
+{
+ if (timers) {
+ g_hash_table_destroy (timers);
+ timers = NULL;
+ }
+}
+
void
ev_debug_message (EvDebugSection section,
const gchar *file,
}
}
+void
+ev_profiler_start (EvProfileSection section,
+ const gchar *format, ...)
+{
+ if (G_UNLIKELY (ev_profile & section)) {
+ GTimer *timer;
+ gchar *name;
+ va_list args;
+
+ if (!format)
+ return;
+
+ va_start (args, format);
+ name = g_strdup_vprintf (format, args);
+ va_end (args);
+
+ timer = g_hash_table_lookup (timers, name);
+ if (!timer) {
+ timer = g_timer_new ();
+ g_hash_table_insert (timers, g_strdup (name), timer);
+ } else {
+ g_timer_start (timer);
+ }
+ }
+}
+
+void
+ev_profiler_stop (EvProfileSection section,
+ const gchar *format, ...)
+{
+ if (G_UNLIKELY (ev_profile & section)) {
+ GTimer *timer;
+ gchar *name;
+ va_list args;
+ gdouble seconds;
+
+ if (!format)
+ return;
+
+ va_start (args, format);
+ name = g_strdup_vprintf (format, args);
+ va_end (args);
+
+ timer = g_hash_table_lookup (timers, name);
+ if (!timer)
+ return;
+
+ g_timer_stop (timer);
+ seconds = g_timer_elapsed (timer, NULL);
+ g_print ("[ %s ] %f s elapsed\n", name, seconds);
+ fflush (stdout);
+ }
+}
+
#endif /* EV_ENABLE_DEBUG */
#ifndef __EV_DEBUG_H__
#define __EV_DEBUG_H__
-#include <glib.h>
+#include <glib-object.h>
+
+#define EV_GET_TYPE_NAME(instance) g_type_name_from_instance ((gpointer)instance)
#ifndef EV_ENABLE_DEBUG
+
#define ev_debug_init()
-#define ev_debug_message(...)
-#else
+#define ev_debug_shutdown()
+#if defined(G_HAVE_GNUC_VARARGS)
+#define ev_debug_message(section, format, args...) G_STMT_START { } G_STMT_END
+#define ev_profiler_start(format, args...) G_STMT_START { } G_STMT_END
+#define ev_profiler_stop(format, args...) G_STMT_START { } G_STMT_END
+#elif defined(G_HAVE_ISO_VARARGS)
+#define ev_debug_message(...) G_STMT_START { } G_STMT_END
+#define ev_profiler_start(...) G_STMT_START { } G_STMT_END
+#define ev_profiler_stop(...) G_STMT_START { } G_STMT_END
+#else /* no varargs macros */
+static void ev_debug_message(EvDebugSection section, const gchar *file, gint line, const gchar *function, const gchar *format, ...) {}
+static void ev_profiler_start(EvProfileSection section, const gchar *format, ...) {}
+static void ev_profiler_stop(EvProfileSection section, const gchar *format, ...) {}
+#endif
+
+#else /* ENABLE_DEBUG */
G_BEGIN_DECLS
EV_DEBUG_JOBS = 1 << 0
} EvDebugSection;
+#define DEBUG_JOBS EV_DEBUG_JOBS, __FILE__, __LINE__, G_STRFUNC
-#define DEBUG_JOBS EV_DEBUG_JOBS, __FILE__, __LINE__, G_STRFUNC
-
-void ev_debug_init (void);
+/*
+ * Set an environmental var of the same name to turn on
+ * profiling. Setting EV_PROFILE will turn on all
+ * sections.
+ */
+typedef enum {
+ EV_NO_PROFILE = 0,
+ EV_PROFILE_JOBS = 1 << 0
+} EvProfileSection;
-void ev_debug_message (EvDebugSection section,
- const gchar *file,
- gint line,
- const gchar *function,
- const gchar *format, ...) G_GNUC_PRINTF(5, 6);
+void ev_debug_init (void);
+void ev_debug_shutdown (void);
+void ev_debug_message (EvDebugSection section,
+ const gchar *file,
+ gint line,
+ const gchar *function,
+ const gchar *format, ...) G_GNUC_PRINTF(5, 6);
+void ev_profiler_start (EvProfileSection section,
+ const gchar *format, ...) G_GNUC_PRINTF(2, 3);
+void ev_profiler_stop (EvProfileSection section,
+ const gchar *format, ...) G_GNUC_PRINTF(2, 3);
G_END_DECLS
void
ev_job_finished (EvJob *job)
{
- ev_debug_message (DEBUG_JOBS, NULL);
+ ev_debug_message (DEBUG_JOBS, EV_GET_TYPE_NAME (job));
+ ev_profiler_stop (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
g_return_if_fail (EV_IS_JOB (job));
-
+
g_signal_emit (job, job_signals[FINISHED], 0);
}
ev_job_links_run (EvJobLinks *job)
{
ev_debug_message (DEBUG_JOBS, NULL);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
g_return_if_fail (EV_IS_JOB_LINKS (job));
notify_page_ready (EvJobRender *job)
{
ev_debug_message (DEBUG_JOBS, "%d", job->ev_page->index);
+ ev_profiler_stop (EV_PROFILE_JOBS, "Rendering page %d", job->ev_page->index);
g_signal_emit (job, job_render_signals[PAGE_READY], 0);
g_return_if_fail (EV_IS_JOB_RENDER (job));
ev_debug_message (DEBUG_JOBS, "page: %d", job->page);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
ev_document_doc_mutex_lock ();
G_CALLBACK (render_finished_cb), job);
} else {
EvRenderContext *rc;
+
+ ev_profiler_start (EV_PROFILE_JOBS, "Rendering page %d", job->page);
ev_document_fc_mutex_lock ();
EvPage *page;
ev_debug_message (DEBUG_JOBS, "%d", job->page);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
g_return_if_fail (EV_IS_JOB_THUMBNAIL (job));
EvDocumentFonts *fonts;
ev_debug_message (DEBUG_JOBS, NULL);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
g_return_if_fail (EV_IS_JOB_FONTS (job));
g_return_if_fail (EV_IS_JOB_LOAD (job));
ev_debug_message (DEBUG_JOBS, "%s", job->uri);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
if (job->error) {
g_error_free (job->error);
gchar *local_uri;
ev_debug_message (DEBUG_JOBS, "uri: %s, document_uri: %s", job->uri, job->document_uri);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
filename = ev_tmp_filename ("saveacopy");
tmp_filename = g_strdup_printf ("%s.XXXXXX", filename);
g_return_if_fail (EV_IS_JOB_PRINT (job));
ev_debug_message (DEBUG_JOBS, NULL);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
if (job->temp_file)
g_free (job->temp_file);
ev_backends_manager_shutdown ();
+ ev_debug_shutdown ();
+
#if WITH_GNOME
g_object_unref (program);
#endif