# Pass this file to Valgrind with "--suppressions=tools/valgrind.supp"

# Intentional thread / memory leak in DM.
{
   dm_keepalive_thread_leak
   Memcheck:Leak
   match-leak-kinds: possible
   ...
   fun:_ZN8SkThreadC1EPFvPvES0_
   ...
   fun:_Z7dm_mainv
   fun:main
}

# Third party lib, driver issues.
{
    ati_driver_bug_1
    Memcheck:Param
    ioctl(generic)
    fun:ioctl
    ...
    obj:/usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
}
{
    ati_driver_bug_2
    Memcheck:Cond
    obj:/usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
}
{
    ati_driver_bug_3
    Memcheck:Addr8
    ...
    obj:/usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
}
{
    ati_driver_bug_4
    Memcheck:Addr4
    ...
    obj:/usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
}
{
    ati_driver_bug_5
    Memcheck:Addr2
    ...
    obj:/usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
}
{
    ati_driver_bug_6
    Memcheck:Addr1
    ...
    obj:/usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
}
{
    ati_driver_bug_7
    Memcheck:Leak
    fun:malloc
    obj:/usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
}
{
    driver_bug_8
    Memcheck:Overlap
    fun:strcpy
    obj:/usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
}
{
    ati_driver_bug_9
    Memcheck:Leak
    fun:calloc
    obj:/usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
}
{
    ati_driver_bug_10
    Memcheck:Leak
    fun:malloc
    obj:/usr/lib/fglrx/fglrx-libGL.so.1.2
}
{
    nv_driver_bug_1
    Memcheck:Param
    write(buf)
    ...
    obj:*/libnvidia-glcore.so*
}
{
    nv_driver_bug_2
    Memcheck:Cond
    ...
    obj:*/libnvidia-glcore.so*
}
{
    nv_driver_bug_3
    Memcheck:Leak
    fun:calloc
    obj:/usr/lib*/libGL.so*
}
{
    #Fixed by FontConfig 2.9.0
    #http://cgit.freedesktop.org/fontconfig/commit/?id=1c475d5c8cb265ac939d6b9e097666e300162511
    font_config_bug_1
    Memcheck:Addr4
    fun:FcConfigFileExists
}
{
    #https://bugs.freedesktop.org/show_bug.cgi?id=8215
    #https://bugs.freedesktop.org/show_bug.cgi?id=8428
    #FcPattern uses 'intptr_t elts_offset' instead of 'FcPatternEltPtr elts',
    #which confuses valgrind.
    font_config_bug_2
    Memcheck:Leak
    fun:*alloc
    ...
    fun:Fc*Add*
}
{
    #Same root cause as font_config_bug_2.
    #The 'leak' here is a copy of rule values, as opposed to new values.
    font_config_bug_3
    Memcheck:Leak
    fun:*alloc
    ...
    fun:FcConfigValues
    fun:FcConfigSubstituteWithPat
    fun:FcFontRenderPrepare
}
{
    #Same root cause as font_config_bug_2.
    #The 'leak' is copies of font or pattern values into returned pattern values.
    font_config_bug_4
    Memcheck:Leak
    fun:*alloc
    ...
    fun:FcValue*
    fun:FcFontRenderPrepare
}
{
    zlib_bug_1
    Memcheck:Cond
    fun:inflateReset2
    fun:inflateInit2_
    fun:png_create_read_struct_2
    fun:png_create_read_struct
}
{
    zlib_bug_2
    Memcheck:Cond
    fun:inflateReset2
    fun:inflateInit2_
    fun:_ZN12_GLOBAL__N_17doFlateEbP8SkStreamP9SkWStream
    fun:_ZN7SkFlate7InflateEP8SkStreamP9SkWStream
}

# Why is it OK to suppress this?
{
    SkRTConfRegistry_bug_1
    Memcheck:Leak
    fun:_Znwm
    fun:_ZN16SkRTConfRegistry12registerConfEP12SkRTConfBase
}

# The gpu_issue_* suppressions suppress issues that cannot be reproduced locally. These appear to be
# due to valgrind not knowing about memory mapped by the ATI driver via glMapBuffer.
{
    gpu_issue_1
    Memcheck:Addr2
    fun:_ZNK5GrGpu18getQuadIndexBufferEv
}
{
    gpu_issue_2
    Memcheck:Addr2
    fun:_ZN24GrAAHairLinePathRenderer6CreateEP9GrContext
}
{
    gpu_issue_3
    Memcheck:Addr2
    fun:_ZN16GrAARectRenderer21aaFillRectIndexBufferEP5GrGpu
}
{
    gpu_issue_4
    Memcheck:Addr8
    fun:_ZN24GrAAHairLinePathRenderer14createLineGeomERK6SkPathP12GrDrawTargetRK8SkTArrayI7SkPointLb1EEiPNS3_19AutoReleaseGeometryEP6SkRect
}
{
    gpu_issue_5
    Memcheck:Addr8
    fun:_ZN21GrDefaultPathRenderer10createGeomERK6SkPathRK11SkStrokeRecfP12GrDrawTargetP15GrPrimitiveTypePiSA_PNS6_19AutoReleaseGeometryE
}
{
    gpu_issue_6
    Memcheck:Addr8
    fun:_ZN22GrAAConvexPathRenderer10onDrawPathERK11SkStrokeRecP12GrDrawTargetb
}
{
    gpu_issue_7
    Memcheck:Addr4
    fun:_ZNK7SkPoint24distanceToLineBetweenSqdERKS_S1_PNS_4SideE
    fun:_ZN22GrAAConvexPathRenderer10onDrawPathERK11SkStrokeRecP12GrDrawTargetb
}
{
    gpu_issue_8
    Memcheck:Addr4
    fun:_ZN24GrAAHairLinePathRenderer14createLineGeomERK6SkPathP12GrDrawTargetRK8SkTArrayI7SkPointLb1EEiPNS3_19AutoReleaseGeometryEP6SkRect
}
{
    gpu_issue_9
    Memcheck:Addr2
    fun:_ZN21GrDefaultPathRenderer10createGeomERK6SkPathRK11SkStrokeRecfP12GrDrawTargetP15GrPrimitiveTypePiSA_PNS6_19AutoReleaseGeometryE
}
{
    gpu_issue_10
    Memcheck:Addr4
    fun:_ZN22GrAAConvexPathRenderer10onDrawPathERK11SkStrokeRecP12GrDrawTargetb
}
{
    gpu_issue_11
    Memcheck:Addr2
    fun:_ZN22GrAAConvexPathRenderer10onDrawPathERK11SkStrokeRecP12GrDrawTargetb
}
{
    gpu_issue_12
    Memcheck:Addr8
    fun:_ZN22GrAAConvexPathRenderer10onDrawPathERK6SkPathRK11SkStrokeRecP12GrDrawTargetb
}
{
    gpu_issue_13
    Memcheck:Addr4
    fun:_ZNK7SkPoint24distanceToLineBetweenSqdERKS_S1_PNS_4SideE
    fun:_ZN22GrAAConvexPathRenderer10onDrawPathERK6SkPathRK11SkStrokeRecP12GrDrawTargetb
}
{
    gpu_issue_14
    Memcheck:Addr4
    fun:_ZN22GrAAConvexPathRenderer10onDrawPathERK6SkPathRK11SkStrokeRecP12GrDrawTargetb
}
{
    gpu_issue_15
    Memcheck:Addr2
    fun:_ZN22GrAAConvexPathRenderer10onDrawPathERK6SkPathRK11SkStrokeRecP12GrDrawTargetb
}

# Valgrind issues caused by tip of tree libjpeg-turbo
# https://code.google.com/p/skia/issues/detail?id=4030
# TODO (msarett): Determine if any of these errors relate to jpeg_skip_scanlines() and fix those.
#                 Issue 4 looks like it may.
#                 Some of these errors may be fixed when we switch to Chromium's version of turbo.
#                 If they are not fixed in Chromium's version, they need to be fixed after we switch.
{
   turbo_issue_1
   Memcheck:Value8
   fun:_itoa_word
   fun:vfprintf
   fun:__vsnprintf_chk
   fun:_ZN8SkString7appendfEPKcz
   fun:_ZN4Task3RunEPS_
   fun:_ZN12_GLOBAL__N_110ThreadPool4LoopEPv
   fun:_ZL12thread_startPv
   fun:start_thread
   fun:clone
}
{
   turbo_issue_2
   Memcheck:Cond
   fun:vfprintf
   fun:__vsnprintf_chk
   fun:_ZN8SkString7appendfEPKcz
   fun:_ZN4Task3RunEPS_
   fun:_ZN12_GLOBAL__N_110ThreadPool4LoopEPv
   fun:_ZL12thread_startPv
   fun:start_thread
   fun:clone
}
{
   turbo_issue_3
   Memcheck:Cond
   fun:_itoa_word
   fun:vfprintf
   fun:__vsnprintf_chk
   fun:_ZN8SkString7appendfEPKcz
   fun:_ZN4Task3RunEPS_
   fun:_ZN12_GLOBAL__N_110ThreadPool4LoopEPv
   fun:_ZL12thread_startPv
   fun:start_thread
   fun:clone
}
{
   turbo_issue_4
   Memcheck:Value8
   fun:ycc_rgb565D_convert
   fun:sep_upsample
   fun:process_data_context_main
   fun:turbo_jpeg_read_scanlines
   fun:turbo_jpeg_skip_scanlines
   fun:_ZN21SkJpegScanlineDecoder15onSkipScanlinesEi
   fun:_ZNK2DM8CodecSrc4drawEP8SkCanvas
   fun:_ZNK2DM10RasterSink4drawERKNS_3SrcEP8SkBitmapP9SkWStreamP8SkString
   fun:_ZN4Task3RunEPS_
   fun:_ZN12_GLOBAL__N_110ThreadPool4LoopEPv
   fun:_ZL12thread_startPv
   fun:start_thread
   fun:clone
}
