# This is a generated file, composed of the following suppression rules:
#  exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp
{
   ld-2.X possibly applying relocations
   exp-sgcheck:SorG
   obj:*/*lib*/ld-2.*so*
   obj:*/*lib*/ld-2.*so*
}

# I'm pretty sure this is a false positive caused by the sg_ stuff
{
   glibc realpath false positive
   exp-sgcheck:SorG
   fun:realpath
   fun:*
}

{
   I think this is glibc's ultra optimised getenv doing 2 byte reads
   exp-sgcheck:SorG
   fun:getenv
}

##----------------------------------------------------------------------##

# Errors to suppress by default with XFree86 3.3.6)

# Format of this file is:
# {
#     name_of_suppression
#     tool_name:supp_kind
#     (optional extra info for some suppression types)
#     caller0 name, or /name/of/so/file.so
#     caller1 name, or ditto
#     (optionally: caller2 name)
#     (optionally: caller3 name)
#  }
#
# For Memcheck, the supp_kinds are:
#
#     Param Value1 Value2 Value4 Value8 Value16 Jump
#     Free Addr1 Addr2 Addr4 Addr8 Addr16
#     Cond (previously known as Value0)
#
# and the optional extra info is:
#     if Param: name of system call param

##----------------------------------------------------------------------##

{
   X11-Cond-0
   Memcheck:Cond
   obj:*libXt.so.6.0
   obj:*libXt.so.6.0
   obj:*libXt.so.6.0
}
{
   X11-Cond-1
   Memcheck:Cond
   fun:__rawmemchr
   obj:*libXt.so.6.0
   obj:*libXt.so.6.0
}


# Suppressions for XFree86-3.3.X

{
   X11-Addr4-1
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libX11.so.6.1
   obj:/usr/X11R6/lib/libX11.so.6.1
   obj:/usr/X11R6/lib/libX11.so.6.1
}

{
   X11-Addr4-2
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libX11.so.6.1
   obj:/usr/X11R6/lib/libX11.so.6.1
   obj:/usr/X11R6/lib/libXt.so.6.0
}

{
   X11-Addr4-3
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
}

{
   X11-Addr4-4
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libX11.so.6.1
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
}

{
   X11-Addr4-5
   Memcheck:Addr4
   fun:__rawmemchr
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
}

{
   X11-Addr4-6
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libXmu.so.6.0
   obj:/usr/X11R6/lib/libXmu.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
}

{
   X11-Addr4-7
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXawXpm_posing_as_Xaw.so.6.1
}

{
   X11-Param-1
   Memcheck:Param
   write(buf)
   fun:__libc_write
   obj:/usr/X11R6/lib/libX11.so.6.1
   obj:/usr/X11R6/lib/libX11.so.6.1
}

{
   X11-Addr4-8
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libX11.so.6.1
   obj:/usr/X11R6/lib/libXpm.so.4.11
   obj:/usr/X11R6/lib/libXpm.so.4.11
}

{
   X11-Addr4-8
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXawXpm_posing_as_Xaw.so.6.1
   obj:/usr/X11R6/lib/libXt.so.6.0
}

{
   X11-Addr4-9
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libXaw.so.6.1
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
}

{
   X11-Addr4-10
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libXaw.so.6.1
   obj:/usr/X11R6/lib/libXaw.so.6.1
   obj:/usr/X11R6/lib/libXt.so.6.0
}

{
   X11-Addr4-11
   Memcheck:Addr4
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXaw.so.6.1
}



##----------------------------------------------------------------------##

##----------------------------------------------------------------------##

# Errors to suppress by default with XFree86 4.1.0)

# *** And a bunch of other stuff which is completely unrelated
# to X.  The default suppressions are a bit of a mess and could do
# with a good tidying up.

# Format of this file is:
# {
#     name_of_suppression
#     tool_name:supp_kind
#     (optional extra info for some suppression types)
#     caller0 name, or /name/of/so/file.so
#     caller1 name, or ditto
#     (optionally: caller2 name)
#     (optionally: caller3 name)
#  }
#
# For Memcheck, the supp_kinds are:
#
#     Param Value1 Value2 Value4 Value8 Value16 Jump
#     Free Addr1 Addr2 Addr4 Addr8 Addr16
#     Cond (previously known as Value0)
#
# and the optional extra info is:
#     if Param: name of system call param

# Resulting from R H 8.0
{
   *libc_write/libX11.so.6.2/*X11TransWrite(Param)
   Memcheck:Param
   write(buf)
   fun:*libc_write
   obj:/usr/*lib*/libX11.so*
   fun:*X11TransWrite
}

{
   libX11.so.6.2/libX11.so.6.2/libX11.so.6.2(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libX11.so*
   obj:/usr/*lib*/libX11.so*
   obj:/usr/*lib*/libX11.so*
}

{
   libXt.so.6.2/libXt.so.6.2/libXt.so.6.2(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libXt.so*
   obj:/usr/*lib*/libXt.so*
   obj:/usr/*lib*/libXt.so*
}


{
   libXaw.so.7.0/libXaw.so.7.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libXaw.so*
   obj:/usr/*lib*/libXaw.so*
   obj:/usr/*lib*/libXaw.so*
}

{
   libXmu.so.6.2/libXmu.so.6.2/libXmu.so.6.2(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libXmu.so*
   obj:/usr/*lib*/libXmu.so*
   obj:/usr/*lib*/libXmu.so*
}

{
   libXt.so.6.0/libXt.so.6.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libXt.so*
   obj:/usr/*lib*/libXt.so*
   obj:/usr/*lib*/libXaw.so*
}

{
   libXaw.so.7.0/libXaw.so.7.0/libXt.so.6.0(Value4)
   Memcheck:Value4
   obj:/usr/*lib*/libXaw.so*
   obj:/usr/*lib*/libXaw.so*
   obj:/usr/*lib*/libXt.so*
}

{
   libXaw.so.7.0/libXaw.so.7.0/libXt.so.6.0(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libXaw.so*
   obj:/usr/*lib*/libXaw.so*
   obj:/usr/*lib*/libXt.so*
}

{
   libX11.so.6.2/libX11.so.6.2/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libX11.so*
   obj:/usr/*lib*/libX11.so*
   obj:/usr/*lib*/libXaw.so*
}

{
   libX11.so.6.2/libX11.so.6.2/libXaw.so.7.0(Addr4)
   Memcheck:Addr4
   obj:/usr/*lib*/libX11.so*
   obj:/usr/*lib*/libX11.so*
   obj:/usr/*lib*/libXaw.so*
}

{
   libX11.so.6.2/libXaw.so.7.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libX11.so*
   obj:/usr/*lib*/libXaw.so*
   obj:/usr/*lib*/libXaw.so*
}

{
   libXpm.so.4.11/libXpm.so.4.11/libXpm.so.4.11
   Memcheck:Cond
   obj:/usr/*lib*/libXpm.so.4.11
   obj:/usr/*lib*/libXpm.so.4.11
   obj:/usr/*lib*/libXpm.so.4.11
}

{
   struct with uninitialized paddings
   Memcheck:Param
   writev(vector[...])
   fun:*_writev
   fun:_X11TransSocketWritev
   fun:_X11TransWritev
   fun:*
}

{
   struct with uninitialized paddings - libxcb
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/*.so
   obj:/usr/lib*/libxcb.so.1.0.0
   obj:/usr/lib*/libxcb.so.1.0.0
   fun:xcb_send_request
   fun:_X*
}

{
   struct with uninitialized paddings - libxcb
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/*.so
   obj:/usr/lib*/libxcb.so.1.0.0
   obj:/usr/lib*/libxcb.so.1.0.0
   obj:/usr/lib*/libxcb.so.1.0.0
   fun:xcb_*
   fun:_X*
}

{
   another struct with uninitialized paddings
   Memcheck:Param
   write(buf)
   obj:*
   fun:_IceTransSocketWrite
   fun:_IceTransWrite
   fun:_IceWrite
}

{
   Xorg 6.8.1 uninit _write* padding
   Memcheck:Param
   write(buf)
   fun:*
   fun:_X11TransWrite
   obj:/usr/*lib*/libX11.so*
}

{
   Xorg 6.8.1 uninit write padding
   Memcheck:Param
   write(buf)
   fun:write
   fun:_X11TransWrite
   obj:/usr/*lib*/libX11.so*
}

{
   Xorg 6.8.1 ICE uninit __write* padding
   Memcheck:Param
   write(buf)
   obj:*
   fun:_IceTransWrite
   fun:_IceWrite
   fun:IceFlush
}

{
   Xorg 6.8.1 writev uninit padding
   Memcheck:Param
   writev(vector[...])
   fun:writev
   obj:/usr/*lib*/libX11.so*
   fun:_X11TransWritev
   fun:_XSend
}

{
   Xorg 6.9.0 writev uninit padding
   Memcheck:Param
   writev(vector[...])
   fun:do_writev
   fun:writev
   obj:/usr/*lib*/libX11.so*
   fun:_X11TransWritev
   fun:_XSend
}

{
   X on SUSE11 writev uninit padding
   Memcheck:Param
   writev(vector[...])
   fun:writev
   obj:/usr/lib*/libxcb.so*
   obj:/usr/lib*/libxcb.so*
}
{
   X on SUSE11 writev uninit padding 2
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/ld-2.*.so*
   obj:/usr/lib*/libxcb.so*
   obj:/usr/lib*/libxcb.so*
}
{
   X on SUSE11 writev uninit padding 3
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/ld-2.*.so*
   obj:/usr/lib*/libORBit*.so*
   obj:/usr/lib*/libORBit*.so*
}
{
   X on SUSE11 writev uninit padding 4
   Memcheck:Param
   writev(vector[...])
   obj:/lib*/libc-2.*.so*
   obj:/usr/lib*/libORBit*.so*
   obj:/usr/lib*/libORBit*.so*
}
 

# There's something strange about a % 127 in XftFontOpenInfo
# (hashing) which gcc turns into a multiply by 33818641 and
# some other guff instead.  I don't understand it enough to
# know if libXft is broken or if memcheck's value tracking is
# inadequate here.  Anyway, for the moment, suppress it.
#
# Use of uninitialised value of size 8
#   at 0x71A59F8: XftFontOpenInfo (in /usr/X11R6/lib64/libXft.so.2.1.2)
#   by 0x71A5F0D: XftFontOpenPattern (in /usr/X11R6/lib64/libXft.so.2.1.2)
#   by 0x65F166E: loadFontConfigFont(QFontPrivate const*, QFontDef const&, 
#                 QFont::Script) (qfontdatabase_x11.cpp:1942)
#   by 0x65F5DE4: QFontDatabase::findFont(QFont::Script, QFontPrivate const*,
#                 QFontDef const&, int) (qfontdatabase.cpp:996)
{
   XftFontOpenInfo-umod-127-strangeness
   Memcheck:Value8
   obj:/usr/X11*/lib*/libXft.so*
   obj:/usr/X11*/lib*/libXft.so*
}
{
   XftFontOpenInfo-umod-127-strangeness-a-la-xorg
   Memcheck:Value8
   obj:/usr/lib*/libXft.so*
   obj:/usr/lib*/libXft.so*
}

{
   More X padding stuff
   Memcheck:Param
   writev(vector[...])
   fun:*writev*
   obj:/usr/X11*/lib*/libX11.so*
   obj:/usr/X11*/lib*/libX11.so*
}

# Inlined strlen in libX11 on Ubuntu 9.10 amd64, unfortunately.
# Invalid read of size 4
#    at 0x9B5CCE6: ??? (in /usr/lib/libX11.so.6.2.0)
#    by 0x9B5D011: XGetAtomName (in /usr/lib/libX11.so.6.2.0)
#    by 0x86407C3: gdk_x11_xatom_to_atom_for_display
#                  (in /usr/lib/libgdk-x11-2.0.so.0.1800.3)
#    by 0x8636817: ??? (in /usr/lib/libgdk-x11-2.0.so.0.1800.3)
#  Address 0x1a558e1c is 28 bytes inside a block of size 30 alloc'd
#    at 0x4C2552D: malloc (vg_replace_malloc.c:236)
#    by 0x9B642C0: _XUpdateAtomCache (in /usr/lib/libX11.so.6.2.0)
#    by 0x9B647F1: ??? (in /usr/lib/libX11.so.6.2.0)
#    by 0x9B81818: ??? (in /usr/lib/libX11.so.6.2.0)
{
   libX11.so.6.2.0/libX11.so.6.2.0(Addr4)
   Memcheck:Addr4
   obj:/usr/*lib*/libX11.so*
   obj:/usr/*lib*/libX11.so*
}

##----------------------------------------------------------------------##
# Completely inappropriate place, but ...

{
   ifort-9.X-on-i686-1
   Memcheck:Addr4
   fun:unaligned_bigint
   fun:hash
   fun:for__add_to_lf_table
}
{
   ifort-9.X-on-amd64-1
   Memcheck:Addr8
   fun:unaligned_bigint
   fun:hash
   fun:for__add_to_lf_table
}


# zlib-1.2.x uses uninitialised memory in some tricky way which
# apparently is harmless (it must amount to a vectorised while-loop,
# nothing else makes sense).  Fools Memcheck though.  See the mentioned
# URL for details.
{
   zlib-1.2.x trickyness (1a): See http://www.zlib.net/zlib_faq.html#faq36
   Memcheck:Cond
   obj:/*lib*/libz.so.1.2.*
   ...
   obj:/*lib*/libz.so.1.2.*
   fun:deflate
}
{
   zlib-1.2.x trickyness (1b): See http://www.zlib.net/zlib_faq.html#faq36
   Memcheck:Cond
   obj:/*lib*/libz.so.1.2.*
   fun:deflate
}

{
   zlib-1.2.x trickyness (2a): See http://www.zlib.net/zlib_faq.html#faq36
   Memcheck:Value8
   obj:/*lib*/libz.so.1.2.*
   ...
   obj:/*lib*/libz.so.1.2.*
   fun:deflate
}
{
   zlib-1.2.x trickyness (2b): See http://www.zlib.net/zlib_faq.html#faq36
   Memcheck:Value8
   obj:/*lib*/libz.so.1.2.*
   fun:deflate
}

{
   zlib-1.2.x trickyness (3a): See http://www.zlib.net/zlib_faq.html#faq36
   Memcheck:Value4
   obj:/*lib*/libz.so.1.2.*
   ...
   obj:/*lib*/libz.so.1.2.*
   fun:deflate
}
{
   zlib-1.2.x trickyness (3b): See http://www.zlib.net/zlib_faq.html#faq36
   Memcheck:Value4
   obj:/*lib*/libz.so.1.2.*
   fun:deflate
}


##----------------------------------------------------------------------##

## More general versions of some of the old X suppressions above
{
   Ubuntu804 libXaw.so.7.0/libXaw.so.7.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libXaw*so*
   obj:/usr/*lib*/libXaw*so*
   obj:/usr/*lib*/libXaw*so*
}
{
   Ubuntu804 libXaw.so.7.0/libXaw.so.7.0/libXt(Cond)
   Memcheck:Cond
   obj:/usr/*lib*/libXaw*so*
   obj:/usr/*lib*/libXaw*so*
   obj:/usr/*lib*/libXt*so*
}

{
   Ubuntu804-hack-1
   Memcheck:Overlap
   fun:mempcpy
   fun:_IO_default_xsputn
   obj:/lib*/libc-2.*so*
}
#
# Suppression patterns for ld, the dynamic loader.
#

# Suppress all data races triggered by ld.
{
   drd-ld
   drd:ConflictingAccess
   obj:*/lib*/ld-*.so
}

#
# Suppression patterns for libc.
#

# Suppress all data races where the topmost frame is inside libc.so. Although
# this could hide some real data races, unfortunately this is the only way to
# not report any false positives on stdio functions. The glibc functions
# manipulating FILE objects use locking primitives that cannot be intercepted
# easily. See also the definitions of _IO_lock_lock() etc. in the file
# nptl/sysdeps/pthread/bits/stdio-lock.h in the glibc source tree.
{
   drd-libc-stdio
   drd:ConflictingAccess
   obj:*/lib*/libc-*
}
{
   drd-libc-thread-cancellation-test
   drd:ConflictingAccess
   fun:write
}
{
   drd-libc-random
   drd:ConflictingAccess
   fun:random_r
   fun:random
}

#
# Suppression patterns for libstdc++, the implementation of the standard C++
# library included with the gcc compiler.
#
# Note: several versions of the libstdc++ library (4.2.2, 4.3.2, 4.4.0, 4.5.0
# and their predecessors) contain an implementation of the std::string class
# that triggers conflicting memory accesses. See also
# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40518
#

# {
#    drd-libstdc++-std::string::string()
#    drd:ConflictingAccess
#    fun:_ZNSsC1ERKSs
# }

{
   drd-libstdc++-cxa_guard_release
   drd:CondErr
   fun:pthread_cond_broadcast@*
   fun:__cxa_guard_release
}


#
# Suppression patterns for libpthread.
#

{
   drd-libpthread-pthread_create
   drd:ConflictingAccess
   ...
   fun:pthread_create*
}
{
   drd-libpthread-pthread_join
   drd:ConflictingAccess
   fun:pthread_join
   fun:pthread_join
}
{
   drd-libpthread-__deallocate_stack
   drd:ConflictingAccess
   ...
   fun:__deallocate_stack
}
{
   drd-libpthread-__free_stacks
   drd:ConflictingAccess
   fun:__free_stacks
}
{
   drd-libpthread-__free_tcb
   drd:ConflictingAccess
   ...
   fun:__free_tcb
}
{
   drd-libpthread-__nptl_deallocate_tsd
   drd:ConflictingAccess
   fun:__nptl_deallocate_tsd
}
{
   drd-libpthread-pthread_detach
   drd:ConflictingAccess
   fun:pthread_detach
   fun:pthread_detach
}
{
   drd-libpthread-pthread_once
   drd:ConflictingAccess
   fun:pthread_once
}
{
   drd-libpthread-pthread_cancel_init
   drd:ConflictingAccess
   fun:pthread_cancel_init
}
{
   drd-libpthread-_Unwind_ForcedUnwind
   drd:ConflictingAccess
   ...
   fun:_Unwind_ForcedUnwind
}
{
   drd-libpthread-_Unwind_GetCFA
   drd:ConflictingAccess
   fun:_Unwind_GetCFA
}
{
   drd-libpthread-_Unwind_Resume
   drd:ConflictingAccess
   ...
   fun:_Unwind_Resume
}
{
   drd-libpthread-?
   drd:ConflictingAccess
   obj:*/lib/libgcc_s.so.1
}
{
   drd-libpthread-nanosleep
   drd:ConflictingAccess
   fun:nanosleep
}

#
# Suppression patterns for libgomp.
#

# Unfortunately many statements in libgomp trigger conflicting accesses. It is
# not clear to me which of these are safe and which ones not. See also
# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40362
{
   drd-libgomp
   drd:ConflictingAccess
   obj:/usr/lib*/libgomp.so*
}

#
# Suppression patterns for libX11.
#

{
   drd-libX11-XCreateFontSet
   drd:CondErr
   fun:pthread_cond_init*
   fun:_XReply
   fun:XListFontsWithInfo
   obj:/usr/lib*/libX11.so*
   fun:XCreateOC
   fun:XCreateFontSet
}

#
# Suppression patterns for libxcb.
#

{
   drd-libxcb-xcb_wait_for_reply
   drd:CondErr
   ...
   fun:pthread_cond_destroy*
   fun:xcb_wait_for_reply
}

#
# Suppression patterns for libglib.
#

{
   drd-libglib-access-g_threads_got_initialized
   drd:ConflictingAccess
   ...
   fun:g_slice_alloc
   fun:g_ptr_array_sized_new
}
{
   drd-libglib-access-g_threads_got_initialized
   drd:ConflictingAccess
   ...
   fun:_ZN27QEventDispatcherGlibPrivateC1EP13_GMainContext
   fun:_ZN20QEventDispatcherGlibC1EP7QObject
   obj:/usr/lib*/libQtCore.so.4.*
   obj:/usr/lib*/libQtCore.so.4.*
}
{
   drd-libglib-access-g_mem_initialized
   drd:ConflictingAccess
   fun:g_malloc0
}
{
   drd-libglib-g_private_get_posix_impl
   drd:ConflictingAccess
   fun:g_private_get_posix_impl
}
{
   drd-libglib-g_private_set_posix_impl
   drd:ConflictingAccess
   fun:g_private_set_posix_impl
}
{
   drd-libglib-g_get_language_names
   drd:ConflictingAccess
   fun:g_slice_free_chain_with_offset
}
{
   drd-libglib-g_main_context_new
   drd:ConflictingAccess
   fun:fcntl
   obj:/usr/lib*/libglib-*.so*
   fun:g_main_context_new
}

#
# Suppression patterns for libQtCore.
#

{
   drd-libQtCore-deref-that-calls-QThreadData-destructor
   drd:ConflictingAccess
   fun:_ZN11QThreadDataD1Ev
   obj:/usr/lib*/libQtCore.so.4.*
}
{
   drd-libQtCore-4.0/4.1-Q_GLOBAL_STATIC-connectionList
   drd:ConflictingAccess
   obj:/usr/lib*/libQtCore.so.4.*
   fun:_ZN11QMetaObject8activateEP7QObjectiiPPv
   fun:_ZN11QMetaObject8activateEP7QObjectPKS_iPPv
}
{
   drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
   drd:ConflictingAccess
   fun:_ZN14QReadWriteLock12lockForWriteEv
   fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
   fun:_ZN7QObjectD2Ev
}
{
   drd-libQtCore-QObjectPrivate::clearGuards(QObject*)
   drd:ConflictingAccess
   fun:_ZN14QReadWriteLock12lockForWriteEv
   fun:_ZN12QWriteLocker6relockEv
   fun:_ZN12QWriteLockerC1EP14QReadWriteLock
   fun:_ZN14QObjectPrivate11clearGuardsEP7QObject
   fun:_ZN7QObjectD2Ev
   fun:_ZN24QAbstractEventDispatcherD2Ev
   fun:_ZN20QEventDispatcherGlibD0Ev
}
{
   drd-libQtCore-QMutexPool::get(void const*)
   drd:ConflictingAccess
   fun:_ZN10QMutexPool3getEPKv
}
{
   drd-libQtCore-qt_gettime_is_monotonic()
   drd:ConflictingAccess
   fun:_Z23qt_gettime_is_monotonicv
}

#
# Suppression patterns for libboost.
#

# Suppress the races on boost::once_flag::epoch and on
# boost::detail::this_thread_epoch. See also the source file
# boost/thread/pthread/once.hpp in the Boost source tree
# (https://svn.boost.org/trac/boost/browser/trunk/boost/thread/pthread/once.hpp).
{
   drd-libboost-boost::call_once<void (*)()>(boost::once_flag&, void (*)())
   drd:ConflictingAccess
   ...
   fun:_ZN5boost9call_onceIPFvvEEEvRNS_9once_flagET_
}
{
   drd-libboost-boost::detail::get_once_per_thread_epoch()
   drd:ConflictingAccess
   fun:_ZN5boost6detail25get_once_per_thread_epochEv
}
# Suppress the race reports on boost::detail::current_thread_tls_key. See also
# https://svn.boost.org/trac/boost/ticket/3526 for more information about why
# the access pattern of current_thread_tls_key is safe.
{
   drd-libboost-boost::detail::get_current_thread_data()
   drd:ConflictingAccess
   ...
   fun:_ZN5boost6detail23get_current_thread_dataEv
}
{
   drd-libboost-boost::detail::set_current_thread_data(boost::detail::thread_data_base*)
   drd:ConflictingAccess
   ...
   fun:_ZN5boost6detail23set_current_thread_dataEPNS0_16thread_data_baseE
}

# FIXME 22 Jan 09: helgrind-glibc2X-005 overlaps with a lot of
# other stuff.  They should be removed.

##----------------------------------------------------------------------##
# Suppressions for the Helgrind tool when using 
# a glibc-2.{3,4,5,6,7,8,9} system

####################################################
# glibc-2.X specific
# These are generic cover-alls which catch a lot of stuff
# in various combinations of ld, libc and libpthread
#
# Note this is heavyhanded and not very clever:
#
# - suppress anything that has its top frame in ld.so
#   That's fine, since it's mostly dynamic linking stuff,
#   which has various deliberate (harmless) races
#
# - suppress anything that has its top frame in libc.so.
#   This really isn't clever, since it could hide some 
#   legitimate races.  But the problem is, if we don't do
#   this, then loads of errors to do with stdio are reported, because
#   H fails to see glibc's internal locking/unlocking of FILE*s
#   as required by POSIX.  A better solution is needed.

#{
#   helgrind-glibc2X-001
#   Helgrind:Race
#   obj:*/lib*/ld-2.*so*
#}

# helgrind-glibc2X-002 was merged into helgrind-glibc2X-001

# helgrind-glibc2X-003 was merged into helgrind-glibc2X-001

{
   helgrind-glibc2X-004
   Helgrind:Race
   obj:*/lib*/libc-2.*so*
}

{
   helgrind-glibc2X-005
   Helgrind:Race
   obj:*/lib*/libpthread-2.*so*
}

# helgrind-glibc2X-006 was merged into helgrind-glibc2X-005

# helgrind-glibc2X-007 was merged into helgrind-glibc2X-001

# helgrind-glibc2X-008 was merged into helgrind-glibc2X-004

# helgrind-glibc2X-009 was merged into helgrind-glibc2X-004

# helgrind-glibc2X-010 was merged into helgrind-glibc2X-001

# helgrind-glibc2X-011 was merged into helgrind-glibc2X-004

# helgrind-glibc2X-012 was merged into helgrind-glibc2X-001

# helgrind-glibc2X-013 was merged into helgrind-glibc2X-001

# helgrind-glibc2X-014 was merged into helgrind-glibc2X-001

# helgrind-glibc2X-015 was merged into helgrind-glibc2X-004

# helgrind-glibc2X-016 was merged into helgrind-glibc2X-004

# These are very ugly.  They are needed to suppress errors inside (eg)
# NPTL's pthread_cond_signal.  Why only one stack frame -- at least we
# should see the wrapper calling the real functions, right?
# Unfortunately, no: the real functions are handwritten assembly (in
# the glibc-2.5 sources) and does not create a proper stack frame.
# Therefore it's only one level of unwinding before we're back out in
# user code rather than the 2 levels you'd expect.
{
   helgrind-glibc2X-101
   Helgrind:Race
   obj:*/lib*/libpthread-2.*so*
   fun:pthread_*
}
{
   helgrind-glibc2X-102
   Helgrind:Race
   fun:mythread_wrapper
   obj:*/lib*/libpthread-2.*so*
}
{
   helgrind-glibc2X-103
   Helgrind:Race
   fun:pthread_cond_*@@GLIBC_2.*
}
{
   helgrind-glibc2X-104
   Helgrind:Race
   fun:__lll_mutex_*
}
{
   helgrind-glibc2X-105
   Helgrind:Race
   fun:pthread_rwlock_*lock*
}
{
   helgrind-glibc2X-106
   Helgrind:Race
   fun:__lll_lock_wait
}
{
   helgrind-glibc2X-107
   Helgrind:Race
   obj:*/lib*/libpthread-2.*so*
   fun:sem_*
}
{
   helgrind-glibc2X-108
   Helgrind:Race
   fun:clone
}
{
   helgrind-glibc2X-109
   Helgrind:Race
   fun:start_thread
}
{
   helgrind-glibc2X-110
   Helgrind:Race
   obj:*/lib*/libc-2.*so*
   fun:pthread_*
}
{
   helgrind-glibc2X-111
   Helgrind:Race
   fun:__lll_*lock_*
}
{
   helgrind-glibc2X-113
   Helgrind:Race
   fun:pthread_barrier_wait*
}


####################################################
# qt4 specific (GNU mangling)
#
{
   helgrind-qt4---QMutex::lock()-QMutex::lock()
   Helgrind:Race
   ...
   fun:_ZN6QMutex4lockEv
   fun:_ZN6QMutex4lockEv
}

{                                                               
   helgrind-qt4---QMutex::unlock()-QMutex::unlock()
   Helgrind:Race                                                
   ...
   fun:_ZN6QMutex6unlockEv                                      
   fun:_ZN6QMutex6unlockEv
}

{
   helgrind-qt4---pthread_setspecific-QThreadPrivate::start(void*)
   Helgrind:Race
   fun:pthread_setspecific
   fun:_ZN14QThreadPrivate5startEPv
}


####################################################
# Other stuff.
#
# pthread_exit apparently calls some kind of unwind
# mechanism - maybe to remove some number of frames
# from the thread's stack, so as to get back to the 
# outermost frame for the thread?  Anyway..

{
   helgrind---*Unwind*-...-pthread_exit
   Helgrind:Race
   fun:*Unwind*
   ...
   fun:pthread_exit
}

{
   helgrind---...-*Unwind*-*pthread_unwind*
   Helgrind:Race
   ...
   fun:*Unwind*
   fun:*pthread_unwind*
}

{
   helgrind---...-*Unwind*-*pthread_unwind*
   Helgrind:Race
   ...
   fun:_Unwind*
   ...
   fun:_Unwind_Backtrace
}




####################################################
# To do with thread stack allocation and deallocation?
#
{
   helgrind---free_stacks-__deallocate_stack
   Helgrind:Race
   fun:free_stacks
   fun:__deallocate_stack
}

{
   helgrind---__deallocate_stack-start_thread-clone
   Helgrind:Race
   fun:__deallocate_stack
   fun:start_thread
   fun:clone
}


####################################################
# To do with pthread_{set,get}specific
#
{
   helgrind---pthread_setspecific
   Helgrind:Race
   fun:pthread_setspecific
}

{
   helgrind---pthread_getspecific
   Helgrind:Race
   fun:pthread_getspecific
}


####################################################
# To do with dynamic linking
#
# helgrind---ld.so-...-dlsym was merged into helgrind-glibc2X-001

{
   helgrind---_dl_allocate_tls 
   Helgrind:Race
   fun:mempcpy
   fun:_dl_allocate_tls_init
   ...
   fun:pthread_create@@GLIBC_2.2*
   fun:pthread_create_WRK
   fun:pthread_create@*
}

####################################################
# To do with GNU libgomp
#
{
   helgrind---libgomp43-1
   Helgrind:Race
   fun:gomp_ordered_sync
}

{
   helgrind---libgomp43-1
   Helgrind:Race
   fun:gomp_ordered_next
}

{
   helgrind---libgomp43-1
   Helgrind:Race
   fun:gomp_ordered_last
}

##----------------------------------------------------------------------##

# Errors to suppress by default with glibc 2.21.x

# IMPORTANT: DO NOT EDIT glibc-2.X.supp, as it is as a generated
# file.  Instead edit glibc-2.X.supp.in.

# Format of this file is:
# {
#     name_of_suppression
#     tool_name:supp_kind
#     (optional extra info for some suppression types)
#     caller0 name, or /name/of/so/file.so
#     caller1 name, or ditto
#     (optionally: caller2 name)
#     (optionally: caller3 name)
#  }
#
# For Memcheck, the supp_kinds are:
#
#     Param Value1 Value2 Value4 Value8 Value16 Jump
#     Free Addr1 Addr2 Addr4 Addr8 Addr16
#     Cond (previously known as Value0)
#
# and the optional extra info is:
#     if Param: name of system call param

##----------------------------------------------------------------------##
##--- generic suppressions                                           ---##
##----------------------------------------------------------------------##

{
   dl-hack3-cond-0
   Memcheck:Cond
   fun:_dl_start
   fun:_start
}
{
   dl-hack3-cond-1
   Memcheck:Cond
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/ld-2.21*.so*
}
{
   dl-hack3-cond-2
   Memcheck:Cond
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/libc-2.21*.so*
}
{
   dl-hack3-cond-3
   Memcheck:Cond
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/libc-2.21*.so*
   obj:*/lib*/libc-2.21*.so*
}
{
   dl-hack3-cond-4
   Memcheck:Cond
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/libdl-2.21*.so*
}

{
   dl-hack4-64bit-addr-1
   Memcheck:Addr8
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/ld-2.21*.so*
}
{
   dl-hack4-64bit-addr-2
   Memcheck:Addr8
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/libc-2.21*.so*
}
{
   dl-hack4-64bit-addr-3
   Memcheck:Addr8
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/ld-2.21*.so*
   obj:*/lib*/libdl-2.21*.so*
}

{
   dl-hack5-32bit-addr-1
   Memcheck:Addr4
   obj:*/lib*/ld-2.21*.so
   obj:*/lib*/ld-2.21*.so
   obj:*/lib*/ld-2.21*.so
}
{
   dl-hack5-32bit-addr-3
   Memcheck:Addr4
   obj:*/lib*/ld-2.21*.so
   obj:*/lib*/ld-2.21*.so
   obj:*/lib*/libdl-2.21*.so*
}
{
   dl-hack5-32bit-addr-4
   Memcheck:Addr4
   obj:*/lib*/ld-2.21*.so
   obj:*/lib*/libdl-2.21*.so*
   obj:*/lib*/ld-2.21*.so
}


##----------------------------------------------------------------------##
##--- Misc ad-hoc hacks                                              ---##
##----------------------------------------------------------------------##
{
   glibc-2.5.x-on-SUSE-10.2-(PPC)-1
   Memcheck:Cond
   fun:_dl_start_final
   fun:_dl_start
   fun:_start
}
{
   glibc-2.5.x-on-SUSE-10.2-(PPC)-2a
   Memcheck:Cond
   fun:index
   obj:*ld-2.21.*.so
}
{
   glibc-2.5.x-on-SuSE-10.2-(PPC)-2b
   Memcheck:Addr4
   fun:index
   fun:expand_dynamic_string_token
}
{
   glibc-2.5.5-on-SuSE-10.2-(PPC)-2c
   Memcheck:Addr4
   fun:index
   obj:*ld-2.21.*.so
}
{
   glibc-2.3.5-on-SuSE-10.1-(PPC)-3
   Memcheck:Addr4
   fun:*wordcopy_fwd_dest_aligned*
   fun:mem*cpy
   obj:*lib*2.21.*.so
}

{
   glibc-2.21-on-SUSE-10.3-(x86)
   Memcheck:Addr4
   obj:*/lib/ld-2.21*.so
   obj:*/lib/ld-2.21*.so
   obj:*/lib/ld-2.21*.so
}

{
   glibc24-64bit-padding-1a
   Memcheck:Param
   socketcall.sendto(msg)
   fun:send
   fun:get_mapping
   fun:__nscd_get_map_ref
   fun:nscd*
}
{
   glibc24-64bit-padding-1b
   Memcheck:Param
   socketcall.sendto(msg)
   fun:__sendto_nocancel
   obj:/*libc-2.21*.so
   obj:/*libc-2.21*.so
   obj:/*libc-2.21*.so
}
{
   glibc24-64bit-padding-1c
   Memcheck:Param
   socketcall.send(msg)
   fun:send
   fun:__nscd_get_map_ref
   fun:nscd_get*_r
   fun:*nscd*
   obj:/*libc-2.21*.so
}


{
   X11-64bit-padding-3a
   Memcheck:Param
   write(buf)
   obj:/*libpthread-2.4.so*
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
   obj:/usr/lib*/libX11.so*
}

{
   X11-64bit-padding-4a
   Memcheck:Param
   socketcall.sendto(msg)
   fun:send
   obj:/*libc-2.21*.so
   obj:/*libc-2.21*.so
   obj:/*libc-2.21*.so
}
{
   X11-64bit-padding-4b
   Memcheck:Param
   socketcall.send(msg)
   fun:send
   obj:/*libc-2.21*.so
   obj:/*libc-2.21*.so
   obj:/*libc-2.21*.so
}

##----------------------------------------------------------------------##
# MontaVista Linux 4.0.1 on ppc32
{
    MVL-401-linuxthreads-pthread_create
    Memcheck:Param
    write(buf)
    fun:pthread_create
}
{
   MVL-401-linuxthreads-pthread_create
   Memcheck:Param
   write(buf)
   obj:*/lib/libpthread-0.10.so
   fun:pthread_create
}

##----------------------------------------------------------------------##
# Ubuntu 10.04 on ARM (Thumb).  Not sure why this is necessary.
{
   U1004-ARM-_dl_relocate_object
   Memcheck:Cond
   fun:_dl_relocate_object
}
