global glib_quarks_2_0_@LT_CURRENT@_@LT_REVISION@

/* 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")
{
  glib_quarks_2_0_@LT_CURRENT@_@LT_REVISION@[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_add_child_source - Called when a child #GSource is added to another
 * @source: the parent #GSource
 * @child_source: the child #GSource
 */
probe glib.source_add_child_source = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("source__add_child_source")
{
  source = $arg1;
  child_source = $arg2;
  probestr = sprintf("glib.source_add_child_source(%p, %p)", source, child_source);
}

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

/**
 * probe glib.rcbox_alloc - Called when a refcounted block is initially requested
 * @mem: Raw memory pointer returned
 * @n_bytes: number of bytes
 * @atomic: Boolean value, %TRUE if this block is atomically refcounted
 * @zeroed: Boolean value, %TRUE if this block was filled with NUL bytes
 */
probe glib.rcbox_alloc = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("rcbox__alloc")
{
  mem = $arg1;
  n_bytes = $arg2;
  atomic = $arg3;
  zeroed = $arg4;
  probestr = sprintf("glib.rcbox_alloc(n_bytes=%d) -> %p", n_bytes, mem);
}

/**
 * probe glib.rcbox_acquire - Called when a refcounted block acquires a ref
 */
probe glib.rcbox_acquire = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("rcbox__acquire")
{
  mem = $arg1;  /* ARG: @mem: Raw memory pointer */
  atomic = $arg2;  /* ARG: @atomic: Boolean value, %TRUE if the reference was acquired atomically */
  probestr = sprintf("glib.rcbox_acquire(mem=%p)", mem);
}

/**
 * probe glib.rcbox_release - Called when a refcounted block acquires a ref
 */
probe glib.rcbox_acquire = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("rcbox__release")
{
  mem = $arg1;  /* ARG: @mem: Raw memory pointer */
  atomic = $arg2;  /* ARG: @atomic: Boolean value, %TRUE if the reference was released atomically */
  probestr = sprintf("glib.rcbox_release(mem=%p)", mem);
}

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