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 a 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);
}
