#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 , 11 years ago
comment:2 by , 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 , 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 , 11 years ago
Milestone: | → 1.10.0 |
---|---|
Resolution: | → fixed |
Status: | new → closed |
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 , 11 years ago
Even, thanks very much for taking care of this all-in-one ticket and the #4926
Related ticket #4926