# hide GObject type init allocs, they can only happen once and are not really
# leaks
{
   type_init
   Memcheck:Leak
   fun:*alloc
   ...
   fun:g_type_register_*
}

{
   type_init2
   Memcheck:Leak
   fun:*alloc
   ...
   fun:g_type_init_*
}

{
   type_init3
   Memcheck:Leak
   fun:*alloc
   ...
   fun:g_type_create_*
}

{
   type_init4
   Memcheck:Leak
   fun:*alloc
   ...
   fun:g_type_class_ref
}

{
   type_init5
   Memcheck:Leak
   fun:*alloc
   ...
   fun:g_type_add_interface_static
}

# module init does this
{
   init7
   Memcheck:Leak
   ...
   fun:*alloc*
   ...
   fun:_dl_init
}

# g_get_home_dir has a private buffer 
{
   gwd
   Memcheck:Leak
   fun:*alloc
   ...
   fun:g_get_home_dir
}

# selinux on ubuntu generates a leak report we ignore
{
   selinux
   Memcheck:Leak
   fun:*alloc
   ...
   obj:/lib/libselinux.so.1
}

# gdk and x init
{
   gdk_init
   Memcheck:Leak
   fun:*alloc
   ...
   fun:gdk_display_open
}

{
   x_init_ext
   Memcheck:Leak
   fun:*alloc
   ...
   fun:XInitExtension
}

{
   gio
   Memcheck:Leak
   fun:malloc
   ...
   fun:g_simple_async_result_complete
}

{
   pthread
   Memcheck:Leak
   fun:calloc
   fun:_dl_allocate_tls
   fun:pthread_create@@GLIBC_*
}

# hide all dbus reports, not the app's problem
{
   dbus
   Memcheck:Leak
   fun:*alloc
   ...
   obj:*/libdbus-1.so.*
}

# hide all orbit leaks, not our problem
{
   orbit
   Memcheck:Leak
   fun:*alloc
   ...
   fun:ORBit_*
}

# other lib init
{
   fontconfig_init
   Memcheck:Leak
   fun:*alloc
   ...
   fun:FcConfigParseAndLoad
}

{
   fontconfig2
   Memcheck:Leak
   fun:malloc
   fun:strdup
   fun:FcValueSave
   obj:*/libfontconfig.so.*
}

{
   fontconfig3
   Memcheck:Leak
   fun:realloc
   ...
   fun:FcFontMatch
}

{
   fontconfig4
   Memcheck:Leak
   fun:realloc
   ...
   fun:FcPatternAddInteger
}

{
   fontconfig5
   Memcheck:Leak
   fun:realloc
   ...
   fun:FcPatternDuplicate
}

{
   fontconfig6
   Memcheck:Leak
   fun:realloc
   ...
   fun:FcDefaultSubstitute
}

{
   freetype_init
   Memcheck:Leak
   fun:*alloc
   ...
   fun:FT_Open_Face
}

{
   harfbuzz
   Memcheck:Leak
   fun:calloc
   ...
   fun:hb_shape_plan_execute
}

{
   goffice_init
   Memcheck:Leak
   fun:*alloc
   ...
   fun:libgoffice_init
}

{
   g_module_init
   Memcheck:Leak
   fun:*alloc
   ...
   fun:g_module_open
}

{
   gtk_module_init
   Memcheck:Leak
   fun:*alloc
   ...
   fun:gtk_module_init
}

# gdk-x11 makes a toplevel object
{
   gdk_x11_init
   Memcheck:Leak
   fun:*alloc
   ...
   fun:_gdk_x11_window_get_toplevel
}

# the icon theme allocates stuff on lazy load
{
   gtk_icon_theme_has_icon
   Memcheck:Leak
   fun:*alloc
   ...
   fun:gtk_icon_theme_has_icon
}

# tooltip labels are not really owned by anyone and will not be freed on exit
{
   gtk_tooltip_set_markup
   Memcheck:Leak
   fun:*alloc
   ...
   fun:gtk_tooltip_set_markup
}

# pango makes a PangoLanguage for every script you use
{
   pango_language
   Memcheck:Leak
   fun:*alloc
   ...
   fun:pango_language_from_string
}

# pango makes a PangoOTRuleset for every font you use
{
   pango_ot_ruleset_get_for_description
   Memcheck:Leak
   fun:*alloc
   ...
   fun:pango_ot_ruleset_get_for_description
}

# pango makes a PangoOTInfo for every font you use
{
   pango_ot_info_get
   Memcheck:Leak
   fun:*alloc
   ...
   fun:pango_ot_info_get
}

# fonts pango has loaded
{
   pango_fc_fontset_get_font_at
   Memcheck:Leak
   fun:*alloc
   ...
   fun:pango_fc_fontset_get_font_at
}

# font maps pango has loaded
{
   pango_fc_font_map_load_fontset
   Memcheck:Leak
   fun:*alloc
   ...
   fun:pango_fc_font_map_load_fontset
}

# ... and font descriptions from every "sans 12" type string
{
   pango_font_description_from_string
   Memcheck:Leak
   fun:*alloc
   ...
   fun:pango_font_description_from_string
}

# gettext has annoying uninit warnings
{
   gettext
   Memcheck:Cond
   fun:__GI___strcasecmp_l
   ...
   fun:__dcigettext
}
{
   gettext
   Memcheck:Value8
   fun:__GI___strcasecmp_l
   ...
   fun:__dcigettext
}

# libz has a warning too ... see this from libpng / libxml2 etc.
{
   libz
   Memcheck:Cond
   fun:inflateReset2
}

# libvips can generate this one spuriously
{
   libvipswrite
   Memcheck:Param
   write(buf)
   ...
   fun:write_vips
}

{
   pixman1
   Memcheck:Cond
   ...
   fun:pixman_image_composite32
}

{
   cairo1
   Memcheck:Cond
   fun:rsvg_cairo_surface_to_pixbuf
}

{
   rsvg
   Memcheck:Cond
   obj:*/librsvg-2.so.*
}

{
   murrine
   Memcheck:Leak
   fun:calloc
   fun:g_malloc0
   fun:raico_blur_create
}

{
   signal_connect
   Memcheck:Leak
   fun:calloc
   fun:g_malloc0
   fun:g_closure_new_simple
   fun:g_cclosure_new
   fun:g_signal_connect_data
}

# ruby has some annoying ones too

{
   ruby1
   Memcheck:Cond
   ...
   fun:rb_parser_compile_file
}

{
   ruby2
   Memcheck:Value8
   ...
   fun:rb_parser_compile_file
}

{
   ruby3
   Memcheck:Cond
   ...
   fun:rb_file_expand_path
}

{
   ruby4
   Memcheck:Value8
   ...
   fun:rb_file_expand_path
}

{
   ruby5
   Memcheck:Value8
   ...
   fun:rb_enc_str_new
}


# helgrind stuff ... run against glib-2.40.x or earlier, later glibs have 
# their own mutex primitive which helgrind can't see

{
   helgrind1
   Helgrind:Race
   fun:g_thread_proxy
   ...
   fun:start_thread
   fun:clone
}

{
   helgrind2
   Helgrind:Race
   fun:strlen
   fun:pthread_setname_np
   fun:g_system_thread_set_name
   fun:g_thread_proxy
   ...
   fun:start_thread
   fun:clone
}

# there's an unlocked assign FALSE which is fine
{
   helgrind3
   Helgrind:Race
   fun:vips_region_prepare_to
}

# unlocked read of pixels-processed-so-far, which is fine
{
   helgrind4
   Helgrind:Race
   fun:vips_sink_base_progress
}

{
   helgrind4a
   Helgrind:Race
   fun:wbuffer_allocate_fn
}

# helgrind can't see g_private
{
   helgrind5
   Helgrind:Race
   fun:g_private_set
}

# use of *stop from generate funcs is unlocked, but fine
{
   helgrind6
   Helgrind:Race
   fun:vips_threadpool_run
}

