From: abv Date: Sun, 3 Mar 2019 07:58:41 +0000 (+0300) Subject: 0027871: VIS - Possible memory leak in viewers in virtual windows mode X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2FCR27871_2;p=occt-copy.git 0027871: VIS - Possible memory leak in viewers in virtual windows mode Command checktrend is modified to avoid performing check for lists containing less than 5 items, as estimations based on short lists often lead to false positives. Disable vtkTimerLog within test checking for memory leaks. --- diff --git a/adm/genproj.tcl b/adm/genproj.tcl index 147f0fb0e2..0a2b7c261d 100644 --- a/adm/genproj.tcl +++ b/adm/genproj.tcl @@ -1422,7 +1422,7 @@ proc osutils:vtkCsf {{theOS ""}} { } } - set aLibArray [list vtkCommonCore vtkCommonDataModel vtkCommonExecutionModel vtkCommonMath vtkCommonTransforms vtkRenderingCore \ + set aLibArray [list vtkCommonCore vtkCommonSystem vtkCommonDataModel vtkCommonExecutionModel vtkCommonMath vtkCommonTransforms vtkRenderingCore \ vtkRenderingOpenGL vtkFiltersGeneral vtkIOCore vtkIOImage vtkImagingCore vtkInteractionStyle] # Additional suffices for the libraries diff --git a/src/DrawResources/TestCommands.tcl b/src/DrawResources/TestCommands.tcl index 1669f17cf4..78e59fcd33 100644 --- a/src/DrawResources/TestCommands.tcl +++ b/src/DrawResources/TestCommands.tcl @@ -2765,13 +2765,14 @@ proc _checkpoint {coord_x coord_y rd_ch gr_ch bl_ch} { # the check fails and procedure raises error with specified message. # # Otherwise the procedure returns false meaning that more iterations are needed. -# Note that false is returned in any case if length of listval is less than 3. +# Note that analysis is peformed only if listval contains at least 5 values, +# thus false is returned unconditionally for shorter lists. # # See example of use to check memory leaks in bugs/caf/bug23489 # proc checktrend {listval delta tolerance message} { set nbval [llength $listval] - if { $nbval < 3} { + if { $nbval < 5} { return 0 } diff --git a/src/IVtkDraw/IVtkDraw.cxx b/src/IVtkDraw/IVtkDraw.cxx index 9c517db488..135d6e9655 100644 --- a/src/IVtkDraw/IVtkDraw.cxx +++ b/src/IVtkDraw/IVtkDraw.cxx @@ -85,11 +85,8 @@ #include #include -// prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4244) -#endif +// prevent disabling some MSVC warning messages by VTK headers +#include #include #include #include @@ -111,6 +108,7 @@ #include #include #include +#include #include #ifndef _WIN32 #include @@ -123,9 +121,7 @@ #include #include #endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include // workaround name conflicts with OCCT methods (in class TopoDS_Shape for example) #ifdef Convex @@ -407,6 +403,37 @@ static Standard_Integer VtkInit (Draw_Interpretor& , return 0; } +//================================================================ +// Function : VtkTimerLog +// Purpose : +//================================================================ +static Standard_Integer VtkTimerLog (Draw_Interpretor& , + Standard_Integer theNbArgs, + const char** theArgVec) +{ + TCollection_AsciiString aVal; + if (theNbArgs == 2) + { + aVal = theArgVec[1]; + aVal.LowerCase(); + } + if (aVal == "1" + || aVal == "on") + { + vtkTimerLog::LoggingOn(); + } + else if (aVal == "0" + || aVal == "off") + { + vtkTimerLog::LoggingOff(); + } + else + { + std::cout << "Syntax error: wrong arguments\n"; + return 1; + } + return 0; +} //================================================================ // Function : CreateActor @@ -1173,6 +1200,11 @@ void IVtkDraw::Commands (Draw_Interpretor& theCommands) "\n\t\t: Creates the Vtk window", __FILE__, VtkInit, group); + theCommands.Add("ivtktimerlog", + "ivtktimerlog {on|off}\n" + "\n\t\t: Enables/disables VTK timer profiler", + __FILE__, VtkTimerLog, group); + theCommands.Add("ivtkdisplay", "ivtkdisplay usage:\n" "ivtkdisplay name1 name2 ..." @@ -1236,7 +1268,6 @@ void IVtkDraw::Commands (Draw_Interpretor& theCommands) __FILE__, VtkBackgroundColor, group); } - //================================================================ // Function : Factory // Purpose : diff --git a/src/TKIVtkDraw/EXTERNLIB b/src/TKIVtkDraw/EXTERNLIB index bf40a7d852..8d8f57e78a 100644 --- a/src/TKIVtkDraw/EXTERNLIB +++ b/src/TKIVtkDraw/EXTERNLIB @@ -22,3 +22,4 @@ vtkImagingCore vtkInteractionStyle vtkRenderingOpenGL vtkRenderingFreeTypeOpenGL +vtkCommonSystem diff --git a/tests/v3d/ivtk/bug27567 b/tests/v3d/ivtk/bug27567 index 5d110ad008..4f9ff65d4a 100644 --- a/tests/v3d/ivtk/bug27567 +++ b/tests/v3d/ivtk/bug27567 @@ -1,66 +1,46 @@ -puts "For OCC27871: Possible memory leak in viewers in virtual windows mode" -puts "For OCC27871: Use 120 kb tolerance for checktrend because of leak on Linux in virtual windows mode" puts "============" -puts "OCC27567" +puts "0027567: Visualization - possible memory leaks due to use of plain pointers in IVTK" puts "============" puts "" -####################################################################### -# Visualization - possible memory leaks due to use of plain pointers -# in IVTK -####################################################################### -ivtkinit +psphere s 10 15 80 +box b1 5 5 -5 +box b2 -5 -5 -5 +ptorus t 10 3 +compound s b1 b2 t cc +unset s +unset b1 +unset b2 +unset t +incmesh cc 1 -dlog off -# Create i_max number of shapes -set i_max 15 +ivtkinit +ivtktimerlog 0 -set listmem {} -for {set i 1} {${i} <= ${i_max}} {incr i} { - - psphere s 10 15 80 - box box1 5 5 -5 - box box2 -5 -5 -5 - ptorus t 10 3 +proc doCycle { theI } { + # display shaded/wireframe + uplevel #0 ivtkdisplay cc + uplevel #0 ivtksetdispmode 1 + uplevel #0 ivtksetdispmode 0 - compound s box1 box2 t b$i + # select/unselect + uplevel #0 ivtkselect 200 200 + uplevel #0 ivtkselect 0 0 - unset s - unset box1 - unset box2 - unset t - + # highlight/unhighlight + uplevel #0 ivtkmoveto 200 200 + uplevel #0 ivtkmoveto 50 50 - # Display the j-th shape - ivtkdisplay b$i - - # Display shaded - ivtksetdispmode 1 - - # Display wired - ivtksetdispmode 0 - - # Select the shape - ivtkselect 200 200 - - # Deselect the shape - ivtkselect 0 0 - - # Highlight the shape - ivtkmoveto 200 200 - - # Unhighlight the shape - ivtkmoveto 50 50 - - # Hide the shape - ivtkerase b$i - - # Remove the shape presentation from memory - ivtkremove b$i - - unset b$i + # hide and remove + uplevel #0 ivtkerase cc + uplevel #0 ivtkremove cc +} +# Create i_max number of shapes +set i_max 15 +set listmem {} +for {set i 1} {${i} <= ${i_max}} {incr i} { + doCycle $i lappend listmem [meminfo h] - checktrend $listmem 0 120000 "Memory leak detected" + checktrend $listmem 0 1 "Memory leak detected" } -