global gquarks

/* This is needed to keep track of gquark for use in other probes.*/
probe process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("quark__new")
{
  gquarks[pid(), $arg2] = user_string($arg1)
}

/**
 * probe glib.quark_new - Called when a #GQuark is initially created
 * @quark: integer value for the quark
 * @str: string form of the quark
 */
probe glib.quark_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("quark__new")
{
  str = user_string ($arg1); 
  quark = $arg2; 
  probestr = sprintf("glib.quark_new(%s) -> %d", str, quark);
}

/**
 * probe glib.mem_alloc - Called when a malloc block is initially requested
 * @mem: Raw memory pointer returned
 * @n_bytes: number of bytes
 * @zeroed: Boolean value, %TRUE if this block was filled with NUL bytes
 * @failable: Boolean value, %TRUE if program execution can continue on allocation failure
 */
probe glib.mem_alloc = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("mem__alloc")
{
  mem = $arg1; 
  n_bytes = $arg2; 
  zeroed = $arg3; 
  failable = $arg4; 
  probestr = sprintf("glib.mem_alloc(n_bytes=%d) -> %p", n_bytes, mem);
}

/**
 * probe glib.mem_free - Called when a malloc block freed
 */
probe glib.mem_free = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("mem__free")
{
  mem = $arg1;  /* ARG: @mem: Raw memory pointer */
  probestr = sprintf("glib.mem_free(mem=%p)", mem);
}

/**
 * probe glib.mem_realloc - Called when a malloc block is resized
 * @mem: Raw memory pointer returned
 * @old_mem: Original memory pointer
 * @n_bytes: number of bytes
 * @failable: Boolean value, %TRUE if program execution can continue on allocation failure
 */
probe glib.mem_realloc = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("mem__realloc")
{
  mem = $arg1; 
  old_mem = $arg2; 
  n_bytes = $arg3;  
  failable = $arg4; 
  probestr = sprintf("glib.mem_realloc(old_mem=%p, n_bytes=%d) -> %p", old_mem, n_bytes, mem);
}

/**
 * probe glib.slice_alloc - Called when g_slice_alloc() is used
 * @mem: Raw memory pointer returned
 * @n_bytes: number of bytes
 */
probe glib.slice_alloc = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("slice__alloc")
{
  mem = $arg1; 
  n_bytes = $arg2; 
  probestr = sprintf("glib.slice_alloc(n_bytes=%d) -> %p", n_bytes, mem);
}

/**
 * probe glib.slice_free - Called when memory slice is freed
 * @mem: Raw memory pointer returned
 * @n_bytes: Number of bytes
 */
probe glib.slice_free = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("slice__free")
{
  mem = $arg1; 
  n_bytes = $arg2; 
  probestr = sprintf("glib.slice_free(n_bytes=%d) -> %p", n_bytes, mem);
}

/**
 * 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");
  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
 * @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");
  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);
}
