
# Suppressions for Darwin 9.x / Mac OS X 10.5 Leopard

##----------------------------------------------------------------------##
# Memcheck
##----------------------------------------------------------------------##

{
   mach_msg_trap-1
   Memcheck:Param
   mach_msg(msg.msgh_remote_port)
   fun:mach_msg_trap
   obj:/System/Library/Frameworks/CoreFoundation*
   obj:/System/Library/Frameworks/ApplicationServices*
}

{
   mach_msg_trap-2
   Memcheck:Param
   mach_msg(msg.msgh_remote_port)
   fun:mach_msg_trap
   obj:/System/Library/Frameworks/CoreFoundation*
   obj:/System/Library/Frameworks/CoreServices*
}

{
   mach_msg_trap-3
   Memcheck:Param
   mach_msg(msg.msgh_remote_port)
   fun:mach_msg_trap
   obj:/System/Library/Frameworks/CoreFoundation*
   obj:/System/Library/Frameworks/Carbon*
}

{
   mach_msg_trap-4
   Memcheck:Param
   mach_msg(msg.msgh_remote_port)
   fun:mach_msg_trap
   obj:/System/Library/Frameworks/CoreFoundation*
   obj:/System/Library/Frameworks/CoreFoundation*
}

{
   mach_msg_trap-5
   Memcheck:Param
   mach_msg(msg.msgh_remote_port)
   fun:mach_msg_trap
   obj:/System/Library/Frameworks/CoreFoundation*
   obj:/System/Library/Frameworks/AppKit*
}

{
   macos-Cond-1
   Memcheck:Cond
   fun:GetVariationInfoFromName
   obj:/System/Library/Frameworks/ApplicationServices*
   obj:/System/Library/Frameworks/ApplicationServices*
}

{
   macos-Cond-2
   Memcheck:Cond
   fun:*PMMutex*Lock*
   obj:/System/Library/Frameworks/ApplicationServices*
   obj:/System/Library/Frameworks/ApplicationServices*
}

{
   macos-Cond-3
   Memcheck:Cond
   fun:sseCGSBlendXXXX8888
   obj:/System/Library/Frameworks/ApplicationServices*
   obj:/System/Library/Frameworks/ApplicationServices*
}

{
   macos-Cond-4
   Memcheck:Cond
   fun:*CASettingsStorage*RefreshSettings*
   obj:/System/Library/Frameworks/CoreAudio*
   obj:/System/Library/Frameworks/CoreAudio*
}

{
   macos-Cond-5
   Memcheck:Cond
   fun:gle*
   obj:/System/Library/Frameworks/OpenGL*
   obj:/System/Library/Frameworks/OpenGL*
}

{
   macos-Cond-6
   Memcheck:Cond
   fun:pthread_rwlock_init$UNIX2003
   fun:main
}

# afaict this is legit.  Might be caused by setenv("VAR=")
# where the value string is empty (not sure)
{
   macos-Cond-7
   Memcheck:Cond
   fun:__setenv
   fun:putenv*
}

{
   macos-futimes-1
   Memcheck:Param
   futimes(tvp[1])
   fun:futimes
   obj:/usr/lib/libSystem*
   obj:/usr/lib/libSystem*
}

{
   macos-vsyslog-hole
   Memcheck:Param
   socketcall.sendto(msg)
   fun:sendto$NOCANCEL$UNIX2003
   fun:vsyslog
}

# Still-reachable memory.

# I chopped this one off at libSystem_initializer, there were more frames.
{
   darwin-still-reachable-1
   Memcheck:Leak
   fun:calloc
   fun:dwarf2_unwind_dyld_add_image_hook
   fun:_ZN4dyld19registerAddCallbackEPFvPK11mach_headerlE
   fun:_dyld_register_func_for_add_image
   fun:__keymgr_initializer
   fun:libSystem_initializer
}

# I chopped this one off at libSystem_initializer, there were more frames.
{
   darwin-still-reachable-2
   Memcheck:Leak
   fun:malloc
   fun:get_or_create_key_element
   fun:_keymgr_get_and_lock_processwide_ptr_2
   fun:dwarf2_unwind_dyld_add_image_hook
   fun:_ZN4dyld19registerAddCallbackEPFvPK11mach_headerlE
   fun:_dyld_register_func_for_add_image
   fun:__keymgr_initializer
   fun:libSystem_initializer
}

{
   darwin-still-reachable-3
   Memcheck:Leak
   fun:malloc
   fun:__smakebuf
   fun:__swsetup
   fun:__sfvwrite
   fun:puts
}

# Genuine leaks.
# See https://bugs.kde.org/show_bug.cgi?id=188572 about this;  it's
# unavoidable due to BSD setenv() semantics.
{
   macos-__setenv-leak-see-our-bug-188572
   Memcheck:Leak
   fun:malloc_zone_malloc
   fun:__setenv
   fun:setenv$UNIX2003
}
{
   macos-localeconv-leak
   Memcheck:Leak
   fun:malloc
   fun:localeconv_l
   fun:__vfprintf
   fun:vsnprintf
}

{
   macos-TFontFeatures::TFontFeatures(unsigned long)-uninitialised-stack-val
   Memcheck:Cond
   fun:_ZN13TFontFeaturesC2Em
   fun:_ZNK9TBaseFont12CopyFeaturesEv
}

# Conditional jump or move depends on uninitialised value(s)
#    at 0x4E5CD59: _DPSNextEvent (in /System/Library/Frameworks
#                  /AppKit.framework/Versions/C/AppKit)
#    by 0x4E5BF87: -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]
#                  (in /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit)
#    by 0x4E54F9E: -[NSApplication run] (in /System/Library/Frameworks
#                  /AppKit.framework/Versions/C/AppKit)
#  Uninitialised value was created by a stack allocation
#    at 0x4E5C450: _DPSNextEvent (in /System/Library/Frameworks
#                                    /AppKit.framework/Versions/C/AppKit)
{
   macos-_DPSNextEvent-stack-allocated-uninit
   Memcheck:Cond
   fun:_DPSNextEvent
}


##----------------------------------------------------------------------##
# Helgrind
##----------------------------------------------------------------------##

# These ones were necessary to give no errors on a tiny non-threaded
# program.  I don't know if they're real problems or false positives (njn).

# keymgr seems to deliberately do some bogus actions, and if they are bogus,
# it passes the error codes back to the caller.
{
   __keymgr_initializer lock failed
   Helgrind:PthAPIerror
   fun:pthread_mutex_lock
   fun:_dyld_register_func_for_*_image
   fun:__keymgr_initializer
   fun:libSystem_initializer
}
{
   __keymgr_initializer unlock failed
   Helgrind:PthAPIerror
   fun:pthread_mutex_unlock
   fun:_dyld_register_func_for_*_image
   fun:__keymgr_initializer
   fun:libSystem_initializer
}
{
   __keymgr_initializer bogus unlock
   Helgrind:UnlockBogus
   fun:pthread_mutex_unlock
   fun:_dyld_register_func_for_*_image
   fun:__keymgr_initializer
   fun:libSystem_initializer
}

# These ones were necessary to give no errors on a tiny threaded program.
# I don't know if they're real problems or false positives (njn).

#{
#   helgrind-darwinlibc-nuke-everything-in-dyld
#   Helgrind:Race
#   obj:/usr/lib/dyld
#}

{
   helgrind-darwinlibc-nuke-everything-in-libSystem.B.dylib
   Helgrind:Race
   obj:/usr/lib/libSystem.B.dylib
}

# This would be better as "fun:\?\?\?" but string matching doesn't seem to
# allow escaping meta-chars.
#
# This is very bad .. not only will it hide races in any
# un-identified piece of code, the ??? also matches any 3-char
# function name.
{
   helgrind-darwinlibc-nuke-everything-in-???-(unknown-code)
   Helgrind:Race
   fun:???
}

{
   helgrind-darwinlibc--mythread_wrapper-*thread*start*
   Helgrind:Race
   fun:mythread_wrapper
   fun:*thread*start*
}

{
   helgrind-darwinlibc--pthread_create_WRK-pthread_create
   Helgrind:Race
   fun:pthread_create_WRK
   fun:pthread_create
}


# Thread #9: Bug in libpthread: recursive write lock granted on 
#            mutex/wrlock which does not support recursion
#  at 0x18696: pthread_cond_wait* (hg_intercepts.c:655)
#  by 0x2300B8: pthread_rwlock_wrlock$UNIX2003 (in /usr/lib/libSystem.B.dylib)
#  by 0x18F41: pthread_rwlock_wrlock* (hg_intercepts.c:1177)
#
# no idea what this is about
#
{
   helgrind-darwin9--pthread-rwlock-kludgery
   Helgrind:Misc
   fun:pthread_cond_wait*
   fun:pthread_rwlock_*lock*
   fun:pthread_rwlock_*lock*
}
