[glib] glib: Add more GLib main context SystemTap and DTrace probes
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] glib: Add more GLib main context SystemTap and DTrace probes
- Date: Thu, 16 Jun 2016 16:11:53 +0000 (UTC)
commit cfb692825aaa64c2663963568df1b7dfa4b67e89
Author: Philip Withnall <philip tecnocode co uk>
Date: Wed Dec 23 16:28:50 2015 +0000
glib: Add more GLib main context SystemTap and DTrace probes
Expand the set of available probes, and add a few more output parameters
to some of the existing ones to make them more useful. I do not know if
this breaks any existing stability guarantees for GLib’s SystemTap
tapset, as it is effectively just adding some more local variables in
the user’s probe.
https://bugzilla.gnome.org/show_bug.cgi?id=759813
glib/glib.stp.in | 506 ++++++++++++++++++++++++++++++++++++++++++++++++++--
glib/glib_probes.d | 41 ++++-
glib/gmain.c | 194 +++++++++++++++------
glib/gthread.c | 4 +
4 files changed, 676 insertions(+), 69 deletions(-)
---
diff --git a/glib/glib.stp.in b/glib/glib.stp.in
index 41f2bbd..fd831ea 100644
--- a/glib/glib.stp.in
+++ b/glib/glib.stp.in
@@ -84,23 +84,505 @@ probe glib.slice_free = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_
}
/**
- * * probe glib.main_before_dispatch - Called before dispatching a GSource
- * * @source: name of the source
- * * @callback: address of the callback
- * */
+ * probe glib.main_after_prepare - Called after preparing a GSource
+ * @source: source pointer
+ * @prepare: prepare function pointer
+ * @source_timeout: callback function pointer
+ */
+probe glib.main_after_prepare = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__after_prepare")
+{
+ source = $arg1;
+ prepare = $arg2;
+ source_timeout = $arg3;
+ probestr = sprintf("glib.main_after_prepare(source=%p, prepare=%p) -> %u", source, prepare,
source_timeout);
+}
+
+/**
+ * probe glib.main_after_check - Called after checking a GSource
+ * @source: source pointer
+ * @check: check function pointer
+ * @result: result of the check call
+ */
+probe glib.main_after_check = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__after_check")
+{
+ source = $arg1;
+ check = $arg2;
+ result = $arg3;
+ probestr = sprintf("glib.main_after_check(source=%p, check=%p) -> %u", source, check, result);
+}
+
+/**
+ * probe glib.main_before_dispatch - Called before dispatching a GSource
+ * @source: name of the source
+ * @source_ptr: source pointer
+ * @dispatch: dispatch function pointer
+ * @callback: callback function pointer
+ * @user_data: user data for @callback
+ */
probe glib.main_before_dispatch = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__before_dispatch")
{
- source = user_string2($arg1, "unnamed");
- probestr = sprintf("glib.main_before_dispatch(source=%s)", source);
+ source = user_string2($arg1, "unnamed");
+ source_ptr = $arg2;
+ dispatch = $arg3;
+ callback = $arg4;
+ user_data = $arg5;
+ probestr = sprintf("glib.main_before_dispatch(source=%s(%p), dispatch=%p, callback=%p, user_data=%p)",
source, source_ptr, dispatch, callback, user_data);
}
/**
- * * probe glib.main_after_dispatch - Called after dispatching a GSource
- * * @source: name of the source
- * * @callback: address of the callback
- * */
+ * probe glib.main_after_dispatch - Called after dispatching a GSource
+ * @source: name of the source
+ * @source_ptr: source pointer
+ * @dispatch: dispatch function pointer
+ * @need_destroy: whether the source should be destroyed
+ */
probe glib.main_after_dispatch = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__after_dispatch")
{
- source = user_string2($arg1, "unnamed");
- probestr = sprintf("glib.main_after_dispatch(source=%s)", source);
+ source = user_string2($arg1, "unnamed");
+ source_ptr = $arg2;
+ dispatch = $arg3;
+ need_destroy = $arg4;
+ probestr = sprintf("glib.main_after_dispatch(source=%s(%p), dispatch=%p) -> %u", source, source_ptr,
dispatch, need_destroy);
+}
+
+/**
+ * probe glib.main_source_attach - Called when a #GSource is attached to a #GMainContext
+ * @source: name of the source
+ * @source_ptr: the #GSource
+ * @context: the #GMainContext the source is being attached to
+ * @id: the ID of the #GSource in the context
+ */
+probe glib.main_source_attach = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__source_attach")
+{
+ source = user_string2($arg1, "unnamed");
+ source_ptr = $arg2;
+ context = $arg3;
+ id = $arg4;
+ probestr = sprintf("glib.main_source_attach(source=%s(%p), context=%p) -> %u", source, source_ptr,
context, id);
+}
+
+/**
+ * probe glib.main_source_destroy - Called when a #GSource is destroyed from a #GMainContext
+ * @source: name of the source
+ * @source_ptr: the #GSource
+ * @context: the #GMainContext the source is being destroyed from
+ */
+probe glib.main_source_destroy = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__source_destroy")
+{
+ source = user_string2($arg1, "unnamed");
+ source_ptr = $arg2;
+ context = $arg3;
+ probestr = sprintf("glib.main_source_destroy(source=%s(%p), context=%p)", source, source_ptr, context);
+}
+
+/*
+ * probe glib.main_context_default - Called when the default #GMainContext is created
+ * @context: pointer to the new default #GMainContext
+ */
+probe glib.main_context_default = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_default")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_default() -> %p", context);
+}
+
+/**
+ * probe glib.main_context_new - Called when a #GMainContext is initially created
+ * @context: pointer to the new #GMainContext
+ */
+probe glib.main_context_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_new")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_new() -> %p", context);
+}
+
+/**
+ * probe glib.main_context_acquire - Called when a thread tries to acquire a #GMainContext
+ * @context: the #GMainContext
+ * @success: TRUE if acquisition was successful; FALSE if there was contention
+ */
+probe glib.main_context_acquire = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_acquire")
+{
+ context = $arg1;
+ success = $arg2;
+ probestr = sprintf("glib.main_context_acquire(context=%p) -> %u", context, success);
+}
+
+/**
+ * probe glib.main_context_release - Called when a thread releases a #GMainContext
+ * @context: the #GMainContext
+ */
+probe glib.main_context_release = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_release")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_release(context=%p)", context);
+}
+
+/**
+ * probe glib.main_context_free - Called when a #GMainContext is freed
+ * @context: pointer to the #GMainContext to be freed
+ */
+probe glib.main_context_free = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_free")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_free(context=%p)", context);
+}
+
+/**
+ * probe glib.main_context_push_thread_default - Called when a #GMainContext is pushed onto the thread
default stack
+ * @context: a #GMainContext
+ */
+probe glib.main_context_push_thread_default = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0
LT_CURRENT@ LT_REVISION@").mark("main__context_push_thread_default")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_push_thread_default(context=%p)", context);
+}
+
+/**
+ * probe glib.main_context_pop_thread_default - Called when a #GMainContext is popped off the thread default
stack
+ * @context: a #GMainContext
+ */
+probe glib.main_context_pop_thread_default = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0
LT_CURRENT@ LT_REVISION@").mark("main__context_pop_thread_default")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_pop_thread_default(context=%p)", context);
+}
+
+/**
+ * probe glib.main_context_before_prepare - Called before a #GMainContext calls prepare on all its #GSources
+ * @context: a #GMainContext
+ */
+probe glib.main_context_before_prepare = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_before_prepare")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_before_prepare(context=%p)", context);
+}
+
+/**
+ * probe glib.main_context_after_prepare - Called after a #GMainContext calls prepare on all its #GSources
+ * @context: a #GMainContext
+ * @priority: priority of the highest priority ready #GSource
+ * @n_ready: number of #GSources ready
+ */
+probe glib.main_context_after_prepare = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_after_prepare")
+{
+ context = $arg1;
+ priority = $arg2;
+ n_ready = $arg3;
+ probestr = sprintf("glib.main_context_after_prepare(context=%p) -> priority=%i,n_ready=%u", context,
priority, n_ready);
+}
+
+/**
+ * probe glib.main_context_before_query - Called before a #GMainContext calls query on all its #GSources
+ * @context: a #GMainContext
+ * @max_priority: maximum priority #GSource to check
+ */
+probe glib.main_context_before_query = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_before_query")
+{
+ context = $arg1;
+ max_priority = $arg2;
+ probestr = sprintf("glib.main_context_before_query(context=%p, max_priority=%i)", context, max_priority);
+}
+
+/**
+ * probe glib.main_context_after_query - Called after a #GMainContext calls query on all its #GSources
+ * @context: a #GMainContext
+ * @timeout: poll timeout to use
+ * @fds: array of FDs ready to be polled, of length @n_fds
+ * @n_fds: number of FDs ready to be polled
+ */
+probe glib.main_context_after_query = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_after_query")
+{
+ context = $arg1;
+ timeout = $arg2;
+ fds = $arg3;
+ n_fds = $arg4;
+ probestr = sprintf("glib.main_context_after_query(context=%p) -> timeout=%u,fds=%p,n_fds=%u", context,
timeout, fds, n_fds);
+}
+
+/**
+ * probe glib.main_context_before_check - Called before a #GMainContext calls check on all its #GSources
+ * @context: a #GMainContext
+ * @max_priority: maximum priority #GSource to check
+ * @fds: array of FDs to check, of length @n_fds
+ * @n_fds: number of FDs to check
+ */
+probe glib.main_context_before_check = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_before_check")
+{
+ context = $arg1;
+ max_priority = $arg2;
+ fds = $arg3;
+ n_fds = $arg4;
+ probestr = sprintf("glib.main_context_before_check(context=%p, max_priority=%i, fds=%p, n_fds=%u)",
context, max_priority, fds, n_fds);
+}
+
+/**
+ * probe glib.main_context_after_check - Called after a #GMainContext calls check on all its #GSources
+ * @context: a #GMainContext
+ * @n_ready: number of sources ready to be dispatched
+ */
+probe glib.main_context_after_check = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_after_check")
+{
+ context = $arg1;
+ n_ready = $arg2;
+ probestr = sprintf("glib.main_context_after_check(context=%p) -> %u", context, n_ready);
+}
+
+/**
+ * probe glib.main_context_before_dispatch - Called before a #GMainContext calls dispatch on all its
#GSources
+ * @context: a #GMainContext
+ */
+probe glib.main_context_before_dispatch = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_before_dispatch")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_before_dispatch(context=%p)", context);
+}
+
+/**
+ * probe glib.main_context_after_dispatch - Called after a #GMainContext calls dispatch on all its #GSources
+ * @context: a #GMainContext
+ */
+probe glib.main_context_after_dispatch = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_after_dispatch")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_after_dispatch(context=%p)", context);
+}
+
+/**
+ * probe glib.main_context_wakeup - Called when a wakeup call is made for a #GMainContext
+ * @context: a #GMainContext
+ */
+probe glib.main_context_wakeup = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__context_wakeup")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_wakeup(context=%p)", context);
+}
+
+/**
+ * probe glib.main_context_wakeup_acknowledge - Called when a wakeup call is acknowledged by a #GMainContext
+ * @context: a #GMainContext
+ */
+probe glib.main_context_wakeup_acknowledge = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0
LT_CURRENT@ LT_REVISION@").mark("main__context_wakeup_acknowledge")
+{
+ context = $arg1;
+ probestr = sprintf("glib.main_context_wakeup_acknowledge(context=%p)", context);
+}
+
+/**
+ * probe glib.main_loop_new - Called when a #GMainLoop is initially created
+ * @loop: pointer to the new #GMainLoop
+ * @context: pointer to the parent #GMainContext
+ */
+probe glib.main_loop_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__loop_new")
+{
+ loop = $arg1;
+ context = $arg2;
+ probestr = sprintf("glib.main_loop_new(%p) -> %p", context, loop);
+}
+
+/**
+ * probe glib.main_context_quit - Called when a #GMainLoop is quit
+ * @loop: pointer to the #GMainLoop to be quit
+ */
+probe glib.main_loop_quit = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("main__loop_quit")
+{
+ loop = $arg1;
+ probestr = sprintf("glib.main_loop_quit(%p)", loop);
+}
+
+/**
+ * probe glib.idle_add - Called when g_idle_add() or g_idle_add_full() is called
+ * @source: the newly created idle #GSource
+ * @context: the #GMainContext the idle source was added to
+ * @id: the ID of the #GSource in the main context
+ * @priority: the priority of the idle source
+ * @func: the idle callback function
+ * @data: data to pass to the callback function
+ */
+probe glib.idle_add = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("idle__add")
+{
+ source = $arg1;
+ context = $arg2;
+ id = $arg3;
+ priority = $arg4;
+ func = $arg5;
+ data = $arg6;
+ probestr = sprintf("glib.idle_add(%d, %p, %p) -> %p, %p, %u", priority, func, data, source, context, id);
+}
+
+/**
+ * probe glib.idle_dispatch - Called when an idle #GSource is dispatched
+ * @source: the idle #GSource
+ * @context: the #GMainContext the idle source was in
+ * @func: the idle callback function
+ * @data: data passed to the callback function
+ * @again: 1 if the idle function is to be scheduled again, 0 otherwise
+ */
+probe glib.idle_dispatch = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("idle__dispatch")
+{
+ source = $arg1;
+ context = $arg2;
+ func = $arg3;
+ data = $arg4;
+ again = $arg5;
+ probestr = sprintf("glib.idle_dispatch(%p) -> %p, %p, %p, %u", source, context, func, data, again);
+}
+
+/**
+ * probe glib.timeout_add - Called when g_timeout_add() or g_timeout_add_full() is called
+ * @source: the newly created timeout #GSource
+ * @context: the #GMainContext the timeout source was added to
+ * @id: the ID of the #GSource in the main context
+ * @priority: the priority of the timeout source
+ * @interval: the time between dispatches of the source, in milliseconds
+ * @func: the timeout callback function
+ * @data: data to pass to the callback function
+ */
+probe glib.timeout_add = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("timeout__add")
+{
+ source = $arg1;
+ context = $arg2;
+ id = $arg3;
+ priority = $arg4;
+ interval = $arg5;
+ func = $arg6;
+ data = $arg7;
+ probestr = sprintf("glib.timeout_add(%d, %u, %p, %p) -> %p, %p, %u", priority, interval, func, data,
source, context, id);
+}
+
+/**
+ * probe glib.timeout_dispatch - Called when an timeout #GSource is dispatched
+ * @source: the timeout #GSource
+ * @context: the #GMainContext the timeout source was in
+ * @func: the timeout callback function
+ * @data: data passed to the callback function
+ * @again: 1 if the timeout is to be scheduled again, 0 otherwise
+ */
+probe glib.timeout_dispatch = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("timeout__dispatch")
+{
+ source = $arg1;
+ context = $arg2;
+ func = $arg3;
+ data = $arg4;
+ again = $arg5;
+ probestr = sprintf("glib.timeout_dispatch(%p) -> %p, %p, %p, %u", source, context, func, data, again);
+}
+
+/**
+ * probe glib.source_new - Called when a new #GSource is created
+ * @source: the new #GSource
+ * @prepare: the prepare function for the #GSource
+ * @check: the check function for the #GSource
+ * @dispatch: the dispatch function for the #GSource
+ * @finalize: the finalize function for the #GSource
+ * @struct_size: the size of #GSource structure to allocate
+ */
+probe glib.source_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("source__new")
+{
+ source = $arg1;
+ prepare = $arg2;
+ check = $arg3;
+ dispatch = $arg4;
+ finalize = $arg5;
+ struct_size = $arg6;
+ probestr = sprintf("glib.source_new(%p, %p, %p, %p, %u) -> %p", prepare, check, dispatch, finalize,
struct_size, source);
+}
+
+/**
+ * probe glib.source_set_callback - Called when the callback on a #GSource is set
+ * @source: the #GSource
+ * @func: the new callback function for the source
+ * @data: data to pass to @func
+ * @notify: notify handler for @data
+ */
+probe glib.source_set_callback = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("source__set_callback")
+{
+ source = $arg1;
+ func = $arg2;
+ data = $arg3;
+ notify = $arg4;
+ probestr = sprintf("glib.source_set_callback(%p, %p, %p, %p)", source, func, data, notify);
+}
+
+/**
+ * probe glib.source_set_callback_indirect - Called when an indirect callback on a #GSource is set
+ * @source: the #GSource
+ * @callback_data: data for @callback_funcs
+ * @ref: the indirect callback ref function
+ * @unref: the indirect callback unref function
+ * @get: the indirect callback getter function
+ */
+probe glib.source_set_callback_indirect = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("source__set_callback_indirect")
+{
+ source = $arg1;
+ callback_data = $arg2;
+ ref = $arg3;
+ unref = $arg4;
+ get = $arg5;
+ probestr = sprintf("glib.source_set_callback_indirect(%p, %p, %p, %p, %p)", source, callback_data, ref,
unref, get);
+}
+
+/**
+ * probe glib.source_set_ready_time - Called when the ready time is set on a #GSource
+ * @source: the #GSource
+ * @ready_time: the new ready time
+ */
+probe glib.source_set_ready_time = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("source__set_ready_time")
+{
+ source = $arg1;
+ ready_time = $arg2;
+ probestr = sprintf("glib.source_set_ready_time(%p, %i)", source, ready_time);
+}
+
+/**
+ * probe glib.source_set_priority - Called when the priority is set on a #GSource
+ * @source: the #GSource
+ * @context: the context the source is attached to
+ * @priority: the new priority
+ */
+probe glib.source_set_priority = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("source__set_priority")
+{
+ source = $arg1;
+ context = $arg2;
+ priority = $arg3;
+ probestr = sprintf("glib.source_set_priority(%p, %p, %i)", source, context, priority);
+}
+
+/**
+ * probe glib.source_set_name - Called when the name is set for a #GSource
+ * @source: the #GSource
+ * @name: the new name
+ */
+probe glib.source_set_name = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("source__set_name")
+{
+ source = $arg1;
+ name = user_string($arg2);
+ probestr = sprintf("glib.source_set_name(%p, %s)", source, name);
+}
+
+/**
+ * probe glib.source_before_free - Called before a #GSource is finalised
+ * @source: the #GSource
+ * @context: the context the #GSource is attached to, if any
+ * @finalize: the finalize function about to be called
+ */
+probe glib.source_before_free = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("source__before_free")
+{
+ source = $arg1;
+ context = $arg2;
+ finalize = $arg3;
+ probestr = sprintf("glib.source_before_free(%p, %p, %p)", source, context, finalize);
+}
+
+/**
+ * probe glib.thread_spawned - Called from a newly spawned GThread, before the thread function is called
+ * @func: the #GThreadFunc about to be executed
+ * @data: data to be passed to @func
+ * @name: (nullable): the thread name
+ */
+probe glib.thread_spawned = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2 0 so 0 LT_CURRENT@
LT_REVISION@").mark("thread__spawned")
+{
+ func = $arg1;
+ data = $arg2;
+ name = user_string($arg3);
+ probestr = sprintf("glib.thread_spawned(%p, %p, %s)", func, data, name);
}
diff --git a/glib/glib_probes.d b/glib/glib_probes.d
index ac955e8..553f7bd 100644
--- a/glib/glib_probes.d
+++ b/glib/glib_probes.d
@@ -5,8 +5,41 @@ provider glib {
probe slice__alloc(void*, unsigned int);
probe slice__free(void*, unsigned int);
probe quark__new(char *, unsigned int);
- probe main__before_dispatch (char *);
- probe main__after_dispatch (char *);
- probe main__source_attach(char*);
- probe main__source_destroy(char*);
+ probe main__after_prepare(void*, void*, unsigned int);
+ probe main__after_check(void*, void*, unsigned int);
+ probe main__before_dispatch(char*, void*, void*, void*, void*);
+ probe main__after_dispatch(char*, void*, void*, unsigned int);
+ probe main__source_attach(char*, void*, void*, unsigned int);
+ probe main__source_destroy(char*, void*, void*);
+ probe main__context_default(void*);
+ probe main__context_new(void*);
+ probe main__context_acquire(void*, void*);
+ probe main__context_release(void*);
+ probe main__context_free(void*);
+ probe main__context_push_thread_default(void*);
+ probe main__context_pop_thread_default(void*);
+ probe main__context_before_prepare(void*);
+ probe main__context_after_prepare(void*, int, unsigned int);
+ probe main__context_before_query(void*, int);
+ probe main__context_after_query(void*, unsigned int, void*, unsigned int);
+ probe main__context_before_check(void*, int, void*, unsigned int);
+ probe main__context_after_check(void*, unsigned int);
+ probe main__context_before_dispatch(void*);
+ probe main__context_after_dispatch(void*);
+ probe main__context_wakeup(void*);
+ probe main__context_wakeup_acknowledge(void*);
+ probe main__loop_new(void*, void*);
+ probe main__loop_quit(void*);
+ probe idle__add(void*, void*, unsigned int, int, void*, void*);
+ probe idle__dispatch(void*, void*, void*, void*, unsigned int);
+ probe timeout__add(void*, void*, unsigned int, int, unsigned int, void*, void*);
+ probe timeout__dispatch(void*, void*, void*, void*, unsigned int);
+ probe source__new(void*, void*, void*, void*, void*, size_t);
+ probe source__set_callback(void*, void*, void*, void*);
+ probe source__set_callback_indirect(void*, void*, void*, void*, void*);
+ probe source__set_ready_time(void*, unsigned int);
+ probe source__set_priority(void*, void*, unsigned int);
+ probe source__set_name(void*, const char*);
+ probe source__before_free(void*, void*, void*);
+ probe thread__spawned(void*, void*, char*);
};
diff --git a/glib/gmain.c b/glib/gmain.c
index 345b0e5..68522b0 100644
--- a/glib/gmain.c
+++ b/glib/gmain.c
@@ -31,6 +31,7 @@
#include "config.h"
#include "glibconfig.h"
+#include "glib_trace.h"
/* Uncomment the next line (and the corresponding line in gpoll.c) to
* enable debugging printouts if the environment variable
@@ -628,6 +629,8 @@ g_main_context_new (void)
context = g_new0 (GMainContext, 1);
+ TRACE (GLIB_MAIN_CONTEXT_NEW (context));
+
g_mutex_init (&context->mutex);
g_cond_init (&context->cond);
@@ -687,6 +690,9 @@ g_main_context_default (void)
if (!default_main_context)
{
default_main_context = g_main_context_new ();
+
+ TRACE (GLIB_MAIN_CONTEXT_DEFAULT (default_main_context));
+
#ifdef G_MAIN_POLL_DEBUG
if (_g_main_poll_debug)
g_print ("default context=%p\n", default_main_context);
@@ -703,6 +709,8 @@ free_context (gpointer data)
{
GMainContext *context = data;
+ TRACE (GLIB_MAIN_CONTEXT_FREE (context));
+
g_main_context_release (context);
if (context)
g_main_context_unref (context);
@@ -783,6 +791,8 @@ g_main_context_push_thread_default (GMainContext *context)
}
g_queue_push_head (stack, context);
+
+ TRACE (GLIB_MAIN_CONTEXT_PUSH_THREAD_DEFAULT (context));
}
/**
@@ -807,6 +817,8 @@ g_main_context_pop_thread_default (GMainContext *context)
g_return_if_fail (stack != NULL);
g_return_if_fail (g_queue_peek_head (stack) == context);
+ TRACE (GLIB_MAIN_CONTEXT_POP_THREAD_DEFAULT (context));
+
g_queue_pop_head (stack);
g_main_context_release (context);
@@ -912,7 +924,11 @@ g_source_new (GSourceFuncs *source_funcs,
source->priv->ready_time = -1;
/* NULL/0 initialization for all other fields */
-
+
+ TRACE (GLIB_SOURCE_NEW (source, source_funcs->prepare, source_funcs->check,
+ source_funcs->dispatch, source_funcs->finalize,
+ struct_size));
+
return source;
}
@@ -1174,8 +1190,6 @@ g_source_attach (GSource *source,
g_return_val_if_fail (source->context == NULL, 0);
g_return_val_if_fail (!SOURCE_DESTROYED (source), 0);
- TRACE (GLIB_MAIN_SOURCE_ATTACH (g_source_get_name (source)));
-
if (!context)
context = g_main_context_default ();
@@ -1183,6 +1197,9 @@ g_source_attach (GSource *source,
result = g_source_attach_unlocked (source, context, TRUE);
+ TRACE (GLIB_MAIN_SOURCE_ATTACH (g_source_get_name (source), source, context,
+ result));
+
UNLOCK_CONTEXT (context);
return result;
@@ -1193,7 +1210,8 @@ g_source_destroy_internal (GSource *source,
GMainContext *context,
gboolean have_lock)
{
- TRACE (GLIB_MAIN_SOURCE_DESTROY (g_source_get_name (source)));
+ TRACE (GLIB_MAIN_SOURCE_DESTROY (g_source_get_name (source), source,
+ context));
if (!have_lock)
LOCK_CONTEXT (context);
@@ -1507,6 +1525,46 @@ g_source_remove_child_source (GSource *source,
UNLOCK_CONTEXT (context);
}
+static void
+g_source_callback_ref (gpointer cb_data)
+{
+ GSourceCallback *callback = cb_data;
+
+ callback->ref_count++;
+}
+
+static void
+g_source_callback_unref (gpointer cb_data)
+{
+ GSourceCallback *callback = cb_data;
+
+ callback->ref_count--;
+ if (callback->ref_count == 0)
+ {
+ if (callback->notify)
+ callback->notify (callback->data);
+ g_free (callback);
+ }
+}
+
+static void
+g_source_callback_get (gpointer cb_data,
+ GSource *source,
+ GSourceFunc *func,
+ gpointer *data)
+{
+ GSourceCallback *callback = cb_data;
+
+ *func = callback->func;
+ *data = callback->data;
+}
+
+static GSourceCallbackFuncs g_source_callback_funcs = {
+ g_source_callback_ref,
+ g_source_callback_unref,
+ g_source_callback_get,
+};
+
/**
* g_source_set_callback_indirect:
* @source: the source
@@ -1538,6 +1596,12 @@ g_source_set_callback_indirect (GSource *source,
if (context)
LOCK_CONTEXT (context);
+ if (callback_funcs != &g_source_callback_funcs)
+ TRACE (GLIB_SOURCE_SET_CALLBACK_INDIRECT (source, callback_data,
+ callback_funcs->ref,
+ callback_funcs->unref,
+ callback_funcs->get));
+
old_cb_data = source->callback_data;
old_cb_funcs = source->callback_funcs;
@@ -1551,47 +1615,6 @@ g_source_set_callback_indirect (GSource *source,
old_cb_funcs->unref (old_cb_data);
}
-static void
-g_source_callback_ref (gpointer cb_data)
-{
- GSourceCallback *callback = cb_data;
-
- callback->ref_count++;
-}
-
-
-static void
-g_source_callback_unref (gpointer cb_data)
-{
- GSourceCallback *callback = cb_data;
-
- callback->ref_count--;
- if (callback->ref_count == 0)
- {
- if (callback->notify)
- callback->notify (callback->data);
- g_free (callback);
- }
-}
-
-static void
-g_source_callback_get (gpointer cb_data,
- GSource *source,
- GSourceFunc *func,
- gpointer *data)
-{
- GSourceCallback *callback = cb_data;
-
- *func = callback->func;
- *data = callback->data;
-}
-
-static GSourceCallbackFuncs g_source_callback_funcs = {
- g_source_callback_ref,
- g_source_callback_unref,
- g_source_callback_get,
-};
-
/**
* g_source_set_callback:
* @source: the source
@@ -1622,6 +1645,8 @@ g_source_set_callback (GSource *source,
g_return_if_fail (source != NULL);
+ TRACE (GLIB_SOURCE_SET_CALLBACK (source, func, data, notify));
+
new_callback = g_new (GSourceCallback, 1);
new_callback->ref_count = 1;
@@ -1665,6 +1690,8 @@ g_source_set_priority_unlocked (GSource *source,
g_return_if_fail (source->priv->parent_source == NULL ||
source->priv->parent_source->priority == priority);
+ TRACE (GLIB_SOURCE_SET_PRIORITY (source, context, priority));
+
if (context)
{
/* Remove the source from the context's source and then
@@ -1804,6 +1831,8 @@ g_source_set_ready_time (GSource *source,
source->priv->ready_time = ready_time;
+ TRACE (GLIB_SOURCE_SET_READY_TIME (source, ready_time));
+
if (context)
{
/* Quite likely that we need to change the timeout on the poll */
@@ -1920,6 +1949,8 @@ g_source_set_name (GSource *source,
if (context)
LOCK_CONTEXT (context);
+ TRACE (GLIB_SOURCE_SET_NAME (source, name));
+
/* setting back to NULL is allowed, just because it's
* weird if get_name can return NULL but you can't
* set that.
@@ -2037,6 +2068,9 @@ g_source_unref_internal (GSource *source,
source->ref_count--;
if (source->ref_count == 0)
{
+ TRACE (GLIB_SOURCE_BEFORE_FREE (source, context,
+ source->source_funcs->finalize));
+
old_cb_data = source->callback_data;
old_cb_funcs = source->callback_funcs;
@@ -3161,9 +3195,11 @@ g_main_dispatch (GMainContext *context)
current->source = source;
current->depth++;
- TRACE( GLIB_MAIN_BEFORE_DISPATCH (g_source_get_name (source)));
+ TRACE (GLIB_MAIN_BEFORE_DISPATCH (g_source_get_name (source), source,
+ dispatch, callback, user_data));
need_destroy = !(* dispatch) (source, callback, user_data);
- TRACE( GLIB_MAIN_AFTER_DISPATCH (g_source_get_name (source)));
+ TRACE (GLIB_MAIN_AFTER_DISPATCH (g_source_get_name (source), source,
+ dispatch, need_destroy));
current->source = prev_source;
current->depth--;
@@ -3228,6 +3264,7 @@ g_main_context_acquire (GMainContext *context)
{
context->owner = self;
g_assert (context->owner_count == 0);
+ TRACE (GLIB_MAIN_CONTEXT_ACQUIRE (context, TRUE /* success */));
}
if (context->owner == self)
@@ -3235,9 +3272,13 @@ g_main_context_acquire (GMainContext *context)
context->owner_count++;
result = TRUE;
}
+ else
+ {
+ TRACE (GLIB_MAIN_CONTEXT_ACQUIRE (context, FALSE /* failure */));
+ }
UNLOCK_CONTEXT (context);
-
+
return result;
}
@@ -3261,6 +3302,8 @@ g_main_context_release (GMainContext *context)
context->owner_count--;
if (context->owner_count == 0)
{
+ TRACE (GLIB_MAIN_CONTEXT_RELEASE (context));
+
context->owner = NULL;
if (context->waiters)
@@ -3402,6 +3445,8 @@ g_main_context_prepare (GMainContext *context,
return FALSE;
}
+ TRACE (GLIB_MAIN_CONTEXT_BEFORE_PREPARE (context));
+
#if 0
/* If recursing, finish up current dispatch, before starting over */
if (context->pending_dispatches)
@@ -3451,6 +3496,7 @@ g_main_context_prepare (GMainContext *context,
UNLOCK_CONTEXT (context);
result = (* prepare) (source, &source_timeout);
+ TRACE (GLIB_MAIN_AFTER_PREPARE (source, prepare, source_timeout));
LOCK_CONTEXT (context);
context->in_check_or_prepare--;
@@ -3515,6 +3561,8 @@ g_main_context_prepare (GMainContext *context,
}
g_source_iter_clear (&iter);
+ TRACE (GLIB_MAIN_CONTEXT_AFTER_PREPARE (context, current_priority, n_ready));
+
UNLOCK_CONTEXT (context);
if (priority)
@@ -3554,6 +3602,8 @@ g_main_context_query (GMainContext *context,
LOCK_CONTEXT (context);
+ TRACE (GLIB_MAIN_CONTEXT_BEFORE_QUERY (context, max_priority));
+
n_poll = 0;
lastpollrec = NULL;
for (pollrec = context->poll_records; pollrec; pollrec = pollrec->next)
@@ -3596,7 +3646,10 @@ g_main_context_query (GMainContext *context,
if (*timeout != 0)
context->time_is_fresh = FALSE;
}
-
+
+ TRACE (GLIB_MAIN_CONTEXT_AFTER_QUERY (context, context->timeout,
+ fds, n_poll));
+
UNLOCK_CONTEXT (context);
return n_poll;
@@ -3639,14 +3692,21 @@ g_main_context_check (GMainContext *context,
return FALSE;
}
+ TRACE (GLIB_MAIN_CONTEXT_BEFORE_CHECK (context, max_priority, fds, n_fds));
+
if (context->wake_up_rec.revents)
- g_wakeup_acknowledge (context->wakeup);
+ {
+ TRACE (GLIB_MAIN_CONTEXT_WAKEUP_ACKNOWLEDGE (context));
+ g_wakeup_acknowledge (context->wakeup);
+ }
/* If the set of poll file descriptors changed, bail out
* and let the main loop rerun
*/
if (context->poll_changed)
{
+ TRACE (GLIB_MAIN_CONTEXT_AFTER_CHECK (context, 0));
+
UNLOCK_CONTEXT (context);
return FALSE;
}
@@ -3691,6 +3751,8 @@ g_main_context_check (GMainContext *context,
result = (* check) (source);
+ TRACE (GLIB_MAIN_AFTER_CHECK (source, check, result));
+
LOCK_CONTEXT (context);
context->in_check_or_prepare--;
}
@@ -3756,6 +3818,8 @@ g_main_context_check (GMainContext *context,
}
g_source_iter_clear (&iter);
+ TRACE (GLIB_MAIN_CONTEXT_AFTER_CHECK (context, n_ready));
+
UNLOCK_CONTEXT (context);
return n_ready > 0;
@@ -3775,11 +3839,15 @@ g_main_context_dispatch (GMainContext *context)
{
LOCK_CONTEXT (context);
+ TRACE (GLIB_MAIN_CONTEXT_BEFORE_DISPATCH (context));
+
if (context->pending_dispatches->len > 0)
{
g_main_dispatch (context);
}
+ TRACE (GLIB_MAIN_CONTEXT_AFTER_DISPATCH (context));
+
UNLOCK_CONTEXT (context);
}
@@ -3941,7 +4009,9 @@ g_main_loop_new (GMainContext *context,
loop->context = context;
loop->is_running = is_running != FALSE;
loop->ref_count = 1;
-
+
+ TRACE (GLIB_MAIN_LOOP_NEW (loop, context));
+
return loop;
}
@@ -4074,6 +4144,8 @@ g_main_loop_quit (GMainLoop *loop)
g_cond_broadcast (&loop->context->cond);
UNLOCK_CONTEXT (loop->context);
+
+ TRACE (GLIB_MAIN_LOOP_QUIT (loop));
}
/**
@@ -4489,6 +4561,8 @@ g_main_context_wakeup (GMainContext *context)
g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
+ TRACE (GLIB_MAIN_CONTEXT_WAKEUP (context));
+
g_wakeup_signal (context->wakeup);
}
@@ -4587,6 +4661,8 @@ g_timeout_dispatch (GSource *source,
again = callback (user_data);
+ TRACE (GLIB_TIMEOUT_DISPATCH (source, source->context, callback, user_data, again));
+
if (again)
g_timeout_set_expiration (timeout_source, g_source_get_time (source));
@@ -4711,6 +4787,9 @@ g_timeout_add_full (gint priority,
g_source_set_callback (source, function, data, notify);
id = g_source_attach (source, NULL);
+
+ TRACE (GLIB_TIMEOUT_ADD (source, g_main_context_default (), id, priority, interval, function, data));
+
g_source_unref (source);
return id;
@@ -5442,14 +5521,20 @@ g_idle_dispatch (GSource *source,
GSourceFunc callback,
gpointer user_data)
{
+ gboolean again;
+
if (!callback)
{
g_warning ("Idle source dispatched without callback\n"
"You must call g_source_set_callback().");
return FALSE;
}
-
- return callback (user_data);
+
+ again = callback (user_data);
+
+ TRACE (GLIB_IDLE_DISPATCH (source, source->context, callback, user_data, again));
+
+ return again;
}
/**
@@ -5517,6 +5602,9 @@ g_idle_add_full (gint priority,
g_source_set_callback (source, function, data, notify);
id = g_source_attach (source, NULL);
+
+ TRACE (GLIB_IDLE_ADD (source, g_main_context_default (), id, priority, function, data));
+
g_source_unref (source);
return id;
diff --git a/glib/gthread.c b/glib/gthread.c
index 88554eb..623ac63 100644
--- a/glib/gthread.c
+++ b/glib/gthread.c
@@ -57,6 +57,7 @@
#include "gslice.h"
#include "gstrfuncs.h"
#include "gtestutils.h"
+#include "glib_trace.h"
/**
* SECTION:threads
@@ -770,6 +771,9 @@ g_thread_proxy (gpointer data)
G_LOCK (g_thread_new);
G_UNLOCK (g_thread_new);
+ TRACE (GLIB_THREAD_SPAWNED (thread->thread.func, thread->thread.data,
+ thread->name));
+
if (thread->name)
{
g_system_thread_set_name (thread->name);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]