#
# 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-*
}

#
# 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
}
