# Valgrind error suppression file

# ============================= libc ==================================

{
   ld.so initialization + selinux
   Memcheck:Leak
   ...
   fun:_dl_init
   obj:/lib/ld-*.so
}

{
   dlopen initialization, triggered by handle-leak-debug code
   Memcheck:Leak
   ...
   fun:__libc_dlopen_mode
   fun:init
   fun:backtrace
   fun:handle_leak_debug_bt
   fun:dynamic_ensure_handle
   fun:tp_handle_ensure
}

{
   ld.so initialization on glibc 2.9
   Memcheck:Cond
   fun:_dl_relocate_object
   fun:dl_main
   fun:_dl_sysdep_start
   fun:_dl_start
   obj:/lib/ld-2.9.so
}

{
   ld.so initialization on glibc 2.9
   Memcheck:Cond
   fun:strlen
   fun:_dl_init_paths
   fun:dl_main
   fun:_dl_sysdep_start
   fun:_dl_start
   obj:/lib/ld-2.9.so
}

{
  selinux, we just don't know
  Memcheck:Leak
  fun:malloc
  fun:getdelim
  obj:/lib/libselinux.so.1
}

# ============================= GLib ==================================

{
   g_set_prgname copies its argument
   Memcheck:Leak
   ...
   fun:g_set_prgname
}

{
   one g_get_charset per child^Wprocess
   Memcheck:Leak
   ...
   fun:g_get_charset
}

{
   GQuarks can't be freed
   Memcheck:Leak
   ...
   fun:g_quark_from_static_string
}

{
   GQuarks can't be freed
   Memcheck:Leak
   ...
   fun:g_quark_from_string
}

{
   interned strings can't be freed
   Memcheck:Leak
   ...
   fun:g_intern_string
}

{
   interned strings can't be freed
   Memcheck:Leak
   ...
   fun:g_intern_static_string
}

{
   shared global default g_main_context
   Memcheck:Leak
   ...
   fun:g_main_context_new
   fun:g_main_context_default
}

{
   GTest initialization
   Memcheck:Leak
   ...
   fun:g_test_init
   fun:main
}

{
   GTest admin
   Memcheck:Leak
   ...
   fun:g_test_add_vtable
}

{
   GTest pseudorandomness
   Memcheck:Leak
   ...
   fun:g_rand_new_with_seed_array
   fun:test_run_seed
   ...
   fun:g_test_run
}

{
   GSLice initialization
   Memcheck:Leak
   ...
   fun:g_malloc0
   fun:g_slice_init_nomessage
   fun:g_slice_alloc
}

# ============================= GObject ===============================

{
   g_type_init
   Memcheck:Leak
   ...
   fun:g_type_init
}

{
   g_type_init_with_debug_flags
   Memcheck:Leak
   ...
   fun:g_type_init_with_debug_flags
}

{
   g_type_register_static
   Memcheck:Leak
   ...
   fun:g_type_register_static
}

{
   g_type_add_interface_static
   Memcheck:Leak
   ...
   fun:g_type_add_interface_static
}

# ============================= GIO ===================================

{
   g_simple_async_result class
   Memcheck:Leak
   ...
   fun:g_type_class_ref
   ...
   fun:g_simple_async_result_new
}

# ============================= dbus-glib =============================

{
   dbus-glib, https://bugs.freedesktop.org/show_bug.cgi?id=14125
   Memcheck:Addr4
   fun:g_hash_table_foreach
   obj:/usr/lib/libdbus-glib-1.so.2.1.0
   fun:g_object_run_dispose
}

{
   registering marshallers is permanent
   Memcheck:Leak
   ...
   fun:dbus_g_object_register_marshaller_array
   fun:dbus_g_object_register_marshaller
}

{
   dbus-glib specialized GTypes are permanent
   Memcheck:Leak
   ...
   fun:dbus_g_type_specialized_init
}

{
   libdbus shared connection
   Memcheck:Leak
   ...
   fun:dbus_g_bus_get
}

{
   dbus-gobject registrations aren't freed unless we fall off the bus
   Memcheck:Leak
   ...
   fun:g_slist_append
   fun:dbus_g_connection_register_g_object
}

{
   DBusGProxy slots aren't freed unless we fall off the bus
   Memcheck:Leak
   ...
   fun:dbus_connection_allocate_data_slot
   ...
   fun:dbus_g_proxy_constructor
}

{
   error registrations are for life, not just for Christmas
   Memcheck:Leak
   ...
   fun:dbus_g_error_domain_register
}

# ============================= telepathy-glib ========================

{
   tp_dbus_daemon_constructor @daemons once per DBusConnection
   Memcheck:Leak
   ...
   fun:g_slice_alloc
   fun:tp_dbus_daemon_constructor
}

{
   tp_proxy_subclass_add_error_mapping refs the enum
   Memcheck:Leak
   ...
   fun:g_type_class_ref
   fun:tp_proxy_subclass_add_error_mapping
}

{
   tp_proxy_or_subclass_hook_on_interface_add never frees its list
   Memcheck:Leak
   ...
   fun:tp_proxy_or_subclass_hook_on_interface_add
}

{
   tp_dbus_daemon_constructor filter not freed til we fall off the bus
   Memcheck:Leak
   ...
   fun:dbus_connection_add_filter
   fun:tp_dbus_daemon_constructor
}

{
   tp_g_socket_address_from_variant reffing GNIO types
   Memcheck:Leak
   ...
   fun:g_type_class_ref
   ...
   fun:tp_g_socket_address_from_variant
}

{
   creating classes for DBusGProxy
   Memcheck:Leak
   ...
   fun:g_type_class_ref
   ...
   fun:g_object_new
   ...
   fun:tp_proxy_borrow_interface_by_id
}

{
   creating classes for tp_dbus_daemon_new
   Memcheck:Leak
   ...
   fun:g_type_class_ref
   ...
   fun:g_object_new
   ...
   fun:tp_dbus_daemon_new
}

{
   creating classes for TpCHannel
   Memcheck:Leak
   ...
   fun:g_type_class_ref
   ...
   fun:g_object_new
   ...
   fun:tp_channel_new
}

{
   creating a boxed type to use in TpCapabilities
   Memcheck:Leak
   ...
   fun:g_type_class_ref
   ...
   fun:g_param_spec_boxed
   fun:tp_capabilities_class_intern_init
}

# ============================= questionable ==========================

{
   creating classes for instances (this is a pretty big hammer)
   Memcheck:Leak
   ...
   fun:g_type_class_ref
   ...
   fun:g_type_create_instance
   ...
   fun:g_param_spec_string
}