Opened 11 years ago

Closed 11 years ago

Last modified 11 years ago

#4928 closed defect (fixed)

Memory leak of drivers registrar mutexes

Reported by: Mateusz Łoskot Owned by: warmerdam
Priority: normal Milestone: 1.10.0
Component: default Version: unspecified
Severity: normal Keywords:
Cc:

Description

Steps to reproduce:

  • GDAL built on Windows using VS2010 with Visual Leak Detector support
  • Simple execution of gdalinfo with GDAL drivers registrar initialisation only shows at least 4 memory leaks:
d:\dev\gdal\_svn\trunk\gdal>apps\gdalinfo --version
Visual Leak Detector Version 2.2.3 installed.
GDAL 1.10dev, released 2011/12/29
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 10 at 0x01FEBC60: 24 bytes ----------
  Call Stack:
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (575): gdal110dev.dll!CPLCreateMutex + 0x8 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (132): gdal110dev.dll!CPLCreateOrAcquireMutex + 0x5 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (73): gdal110dev.dll!CPLMutexHolder::CPLMutexHolder + 0x12 bytes
    d:\dev\gdal\_svn\trunk\gdal\gcore\gdaldrivermanager.cpp (82): gdal110dev.dll!GetGDALDriverManager
    d:\dev\gdal\_svn\trunk\gdal\frmts\gdalallregister.cpp (76): gdal110dev.dll!GDALAllRegister + 0x5 bytes
    d:\dev\gdal\_svn\trunk\gdal\apps\gdalinfo.c (109): gdalinfo.exe!main
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (555): gdalinfo.exe!__tmainCRTStartup + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): gdalinfo.exe!mainCRTStartup
    0x75AD33AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
    0x77AC9EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
    0x77AC9EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
  Data:
    D8 F0 7D 00    FF FF FF FF    00 00 00 00    00 00 00 00     ..}..... ........
    00 00 00 00    A0 0F 00 00                                   ........ ........


---------- Block 25 at 0x01FEBD38: 24 bytes ----------
  Call Stack:
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (575): gdal110dev.dll!CPLCreateMutex + 0x8 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (146): gdal110dev.dll!CPLCreateOrAcquireMutex + 0x5 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (73): gdal110dev.dll!CPLMutexHolder::CPLMutexHolder + 0x12 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_vsil.cpp (915): gdal110dev.dll!VSIFileManager::Get + 0x20 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_vsil.cpp (950): gdal110dev.dll!VSIFileManager::GetHandler + 0x5 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_vsil.cpp (435): gdal110dev.dll!VSIStatExL + 0x9 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_vsil.cpp (385): gdal110dev.dll!VSIStatL + 0xF bytes
    d:\dev\gdal\_svn\trunk\gdal\gcore\gdaldrivermanager.cpp (699): gdal110dev.dll!GDALDriverManager::AutoLoadDrivers + 0x18 bytes
    d:\dev\gdal\_svn\trunk\gdal\frmts\gdalallregister.cpp (79): gdal110dev.dll!GDALAllRegister
    d:\dev\gdal\_svn\trunk\gdal\apps\gdalinfo.c (109): gdalinfo.exe!main
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (555): gdalinfo.exe!__tmainCRTStartup + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): gdalinfo.exe!mainCRTStartup
    0x75AD33AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
    0x77AC9EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
    0x77AC9EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
  Data:
    78 F1 7D 00    FF FF FF FF    00 00 00 00    00 00 00 00     x.}..... ........
    00 00 00 00    A0 0F 00 00                                   ........ ........


---------- Block 97 at 0x01FEBEA0: 24 bytes ----------
  Call Stack:
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (575): gdal110dev.dll!CPLCreateMutex + 0x8 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (146): gdal110dev.dll!CPLCreateOrAcquireMutex + 0x5 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (73): gdal110dev.dll!CPLMutexHolder::CPLMutexHolder + 0x12 bytes
    d:\dev\gdal\_svn\trunk\gdal\alg\gdaltransformer.cpp (2697): gdal110dev.dll!GDALRegisterTransformDeserializer
    d:\dev\gdal\_svn\trunk\gdal\frmts\vrt\vrtdriver.cpp (47): gdal110dev.dll!VRTDriver::VRTDriver + 0x14 bytes
    d:\dev\gdal\_svn\trunk\gdal\frmts\vrt\vrtdriver.cpp (340): gdal110dev.dll!GDALRegister_VRT + 0x1B bytes
    d:\dev\gdal\_svn\trunk\gdal\frmts\gdalallregister.cpp (87): gdal110dev.dll!GDALAllRegister
    d:\dev\gdal\_svn\trunk\gdal\apps\gdalinfo.c (109): gdalinfo.exe!main
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (555): gdalinfo.exe!__tmainCRTStartup + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): gdalinfo.exe!mainCRTStartup
    0x75AD33AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
    0x77AC9EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
    0x77AC9EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
  Data:
    A0 F1 7D 00    FF FF FF FF    00 00 00 00    00 00 00 00     ..}..... ........
    00 00 00 00    A0 0F 00 00                                   ........ ........


---------- Block 1645 at 0x0201ACB8: 24 bytes ----------
  Call Stack:
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (575): gdal110dev.dll!CPLCreateMutex + 0x8 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (146): gdal110dev.dll!CPLCreateOrAcquireMutex + 0x5 bytes
    d:\dev\gdal\_svn\trunk\gdal\port\cpl_multiproc.cpp (73): gdal110dev.dll!CPLMutexHolder::CPLMutexHolder + 0x12 bytes
    d:\dev\gdal\_svn\trunk\gdal\gcore\gdalproxypool.cpp (328): gdal110dev.dll!GDALDatasetPool::PreventDestroy + 0x24 bytes
    d:\dev\gdal\_svn\trunk\gdal\gcore\gdalproxypool.cpp (338): gdal110dev.dll!GDALDatasetPoolPreventDestroy
    d:\dev\gdal\_svn\trunk\gdal\gcore\gdaldrivermanager.cpp (167): gdal110dev.dll!GDALDriverManager::~GDALDriverManager
    0x53C9C4CD (File and line number not available): gdal110dev.dll!GDALDriverManager::`vector deleting destructor' + 0x4D bytes
    d:\dev\gdal\_svn\trunk\gdal\gcore\gdaldrivermanager.cpp (780): gdal110dev.dll!GDALDestroyDriverManager + 0x22 bytes
    d:\dev\gdal\_svn\trunk\gdal\gcore\gdaldllmain.cpp (107): gdal110dev.dll!DllMain
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtdll.c (512): gdal110dev.dll!__DllMainCRTStartup + 0x11 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtdll.c (476): gdal110dev.dll!_DllMainCRTStartup + 0x11 bytes
    0x77AC9950 (File and line number not available): ntdll.dll!RtlQueryEnvironmentVariable + 0x241 bytes
    0x77ADD6B2 (File and line number not available): ntdll.dll!LdrShutdownProcess + 0x141 bytes
    0x77ADD554 (File and line number not available): ntdll.dll!RtlExitUserProcess + 0x74 bytes
    0x75AD7A0D (File and line number not available): kernel32.dll!ExitProcess + 0x15 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crt0dat.c (709): MSVCR100D.dll!__crtExitProcess
    f:\dd\vctools\crt_bld\self_x86\crt\src\crt0dat.c (621): MSVCR100D.dll!doexit + 0x9 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crt0dat.c (393): MSVCR100D.dll!exit + 0xD bytes
    d:\dev\gdal\_svn\trunk\gdal\apps\gdalinfo.c (116): gdalinfo.exe!main
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (555): gdalinfo.exe!__tmainCRTStartup + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): gdalinfo.exe!mainCRTStartup
    0x75AD33AA (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
    0x77AC9EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
    0x77AC9EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
  Data:
    B0 B1 7D 00    FF FF FF FF    00 00 00 00    00 00 00 00     ..}..... ........
    00 00 00 00    A0 0F 00 00                                   ........ ........


Visual Leak Detector detected 4 memory leaks (240 bytes).
Largest number used: 205939 bytes.
Total allocations: 263114 bytes.
Visual Leak Detector is now exiting.

d:\dev\gdal\_svn\trunk\gdal>

I'm not sure if this is unkown or known problem, or perhaps this behaviour is by-design. I assume it's unknown issue, thus a bug. If it is by-design, then it should probably be documented.

Anyhow, I think a create/destroy symmetry for these mutexes would be desirable.

Can we do it at the final stage of CPL clean-up?

Change History (5)

comment:1 by Mateusz Łoskot, 11 years ago

Related ticket #4926

comment:2 by Even Rouault, 11 years ago

I believe that those are not real leaks, just "one time leaks" (stuff reported as still reachable by Valgrind for example), so the consequence is not so big, except that VLD yells apparently.

I'm not sure how you can cleanup that without having a cleanup function for each mutex, but if you want to give it a try, feel free.

comment:3 by Mateusz Łoskot, 11 years ago

CPL mutex allocates memory from dynamic storage. This memory is not freed for number of mutexes bound to guard various data in GDAL. This is a leak.

For the same reason GDALDriverManager::~GDALDriverManager() frees its own mutex:

    if( hDMMutex )
    {
        CPLDestroyMutex( hDMMutex );
        hDMMutex = NULL;
    }

I think, all the other mutexes bound to known static data should be freed too, from GDAL/OGR clean-up calls.

comment:4 by Even Rouault, 11 years ago

Milestone: 1.10.0
Resolution: fixed
Status: newclosed

svn commit port/cpl_conv.cpp port/cpl_vsil.cpp port/cpl_multiproc.cpp port/cpl_multiproc.h port/cpl_conv.h ogr/ogr_srs_api.h ogr/ogrct.cpp ogr/ogrspatialreference.cpp frmts/gtiff/geotiff.cpp frmts/grib/gribdataset.cpp gcore/gdaldrivermanager.cpp gcore/gdalclientserver.cpp alg/gdal_alg_priv.h alg/gdaltransformer.cpp port/cpl_error.cpp port/cpl_error.h -m "Free various mutex in GDALDestroyDriverManager() (#4926, #4928, #4984)"

comment:5 by Mateusz Łoskot, 11 years ago

Even, thanks very much for taking care of this all-in-one ticket and the #4926

Note: See TracTickets for help on using tickets.