global gtypes
global gtypenames
global gsignalnames

/* These are needed to keep track of gtype and signal names for the below
 * probes.
 */
probe process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("type__new")
{
  gtypes[pid(),user_string($arg1)] = $arg3;
  gtypenames[pid(),$arg3] = user_string($arg1);
}
probe process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("signal__new")
{
  gsignalnames[pid(),$arg1] = user_string($arg2);
}

/**
 * probe gobject.type_new - Called when any entity registered with the #GType system is created
 * @name: String name of type
 * @parent_gtype: The parent #GType of this type
 * @gtype: The #GType for this type
 */
probe gobject.type_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("type__new")
{
  name = user_string($arg1); 
  parent_gtype = $arg2; 
  gtype = $arg3; 
  probestr = sprintf("gobject.type_new(%s, %d) -> %d", name, parent_gtype, gtype);
}

/**
 * probe gobject.object_new - Called when a #GObject is created
 * @object: Raw pointer to object
 * @gtype: #GType for this object
 * @type: String name of object type
 */
probe gobject.object_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__new")
{
  object = $arg1; 
  gtype = $arg2; 
  type = gtypenames[pid(),$arg2]; 
  probestr = sprintf("gobject.object_new(%s) -> %p", type, object);
}

/**
 * probe gobject.object_ref - Called when a new reference is added to a #GObject
 * @object: Raw pointer to object
 * @gtype: #GType for this object
 * @type: String name of object type
 * @old_refcount: Original value of the reference count
 * @refcount: New value of the reference count
 */
probe gobject.object_ref = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__ref")
{
  object = $arg1; 
  gtype = $arg2; 
  type = gtypenames[pid(),gtype]; 
  old_refcount = $arg3; 
  refcount = old_refcount+1; 
  probestr = sprintf("gobject.object_ref(%p[%s]) -> %d", object, type, refcount);
}

/**
 * probe gobject.object_unref - Called when a reference is removed from a #GObject
 * @object: Raw pointer to object
 * @gtype: #GType for this object
 * @type: String name of object type
 * @old_refcount: Original value of the reference count
 */
probe gobject.object_unref = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__unref")
{
  object = $arg1; 
  gtype = $arg2; 
  type = gtypenames[pid(),gtype]; 
  old_refcount = $arg3; 
  refcount = old_refcount-1; 
  probestr = sprintf("gobject.object_unref(%p [%s]) -> %d", object, type, refcount);
}

/**
 * probe gobject.object_dispose - Called when a g_object_dispose() run for a #GObject is initiated
 * @object: Raw pointer to object
 * @gtype: #GType for this object
 * @type: String name of object type
 * @last_unref: FIXME
 */
probe gobject.object_dispose = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__dispose")
{
  object = $arg1; 
  gtype = $arg2; 
  type = gtypenames[pid(),$arg2]; 
  last_unref = $arg3; 
  probestr = sprintf("gobject.object_dispose(%p[%s])", object, type);
}

/**
 * probe gobject.object_dispose_end - Called when a g_object_dispose() run for a #GObject is completed
 * @object: Raw pointer to object
 * @gtype: #GType for this object
 * @type: String name of object type
 * @last_unref: FIXME
 */
probe gobject.object_dispose_end = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__dispose__end")
{
  object = $arg1; 
  gtype = $arg2; 
  type = gtypenames[pid(),$arg2]; 
  last_unref = $arg3; 
  probestr = sprintf("gobject.object_dispose_end(%p[%s])", object, type);
}

/**
 * probe gobject.object_finalize - Called when finalization for a #GObject is started
 * @object: Raw pointer to object
 * @gtype: #GType for this object
 * @type: String name of object type
 */
probe gobject.object_finalize = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__finalize")
{
  object = $arg1; 
  gtype = $arg2; 
  type = gtypenames[pid(),$arg2]; 
  probestr = sprintf("gobject.object_finalize(%p[%s])", object, type);
}

/**
 * probe gobject.object_finalize - Called when finalization for a #GObject is completed
 * @object: Raw pointer to object
 * @gtype: #GType for this object
 * @type: String name of object type
 */
probe gobject.object_finalize_end = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__finalize__end")
{
  object = $arg1; 
  gtype = $arg2; 
  type = gtypenames[pid(),$arg2]; 
  probestr = sprintf("gobject.object_finalize_end(%p[%s])", object, type);
}

/**
 * probe gobject.signal_new - Called when a new signal is registered for a #GObject
 * @gsignal: Integer value for this signal
 * @name: String name for this signal
 * @gtype: #GType for the type which will gain the new signal
 * @type: String name of the type which will gain the new signal
 */
probe gobject.signal_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("signal__new")
{
  gsignal = $arg1; 
  name = user_string($arg2); 
  gtype = $arg3; 
  type = gtypenames[pid(),$arg3]; 
  probestr = sprintf("gobject.signal_new(%s, %s) -> %d", name, type, gsignal);
}

/**
 * probe gobject.signal_emit - Called when a signal emission for a #GObject is started
 * @gsignal: Integer value for this signal
 * @detail: String containing signal "detail"
 * @signal: String name of the signal
 * @object: Raw pointer for object emitting signal
 * @gtype: #GType for the type emitting the signal
 * @type: String name of the type emitting the signal
 */
probe gobject.signal_emit = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("signal__emit")
{
  gsignal = $arg1; 
  detail = $arg2; 
  signal = gsignalnames[pid(),$arg1]; 
  if (detail != 0)
    signal = signal . "::" . gquarks[pid(), detail]
  object = $arg3; 
  gtype = $arg4; 
  type = gtypenames[pid(),$arg4]; 
  probestr = sprintf("gobject.signal_emit(%p[%s], %s)", object, type, signal);
}

/**
 * probe gobject.signal_emit_end - Called when a signal emission for a #GObject is completed
 * @gsignal: Integer value for this signal
 * @detail: String containing signal "detail"
 * @signal: String name of the signal
 * @object: Raw pointer for object emitting signal
 * @gtype: #GType for the type emitting the signal
 * @type: String name of the type emitting the signal
 */
probe gobject.signal_emit_end = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("signal__emit__end")
{
  gsignal = $arg1; 
  detail = $arg2; 
  signal = gsignalnames[pid(),$arg1]; 
  if (detail != 0)
    signal = signal . "::" . gquarks[pid(), detail]
  object = $arg3; 
  gtype = $arg4; 
  type = gtypenames[pid(),$arg4]; 
  probestr = sprintf("gobject.signal_emit_end(%p[%s], %s)", object, type, signal);
}
