Hi Frank,

I also suggest you use the push_context() and pop_context() methods at the
beginning and the end of your algorithm. garbage.push_context() creates a
new collector. Objects collected will go to this new list. Then, at the end
of your algorithm, just call .smart_purge() and then pop_context().
Otherwise, when calling the smart_purge() method, you'll erase all other
objects that might have been stored in the gc thus causing strange things.

def my_high_memory_consuming_algorithm():
    GarbageCollector.garbage.push_context()

    ... do whatever you want ...

    GarbageCollector.garbage.smart_purge() #only the objects created since
the call to push_context are erased. Use MMGT_OPT=0 to make sure freeing
#memory.
    GarbageCollector.pop_context()
    return data

There's also a garbage.prevent_object(object) method, that will take care to
not delete an object that it's important to keep reference.

These three functions are quite new (but validated with a unittest). I'm
curious to have your feedback!

Regards,

Thomas

These two functions are quite new,
2010/3/16 Frank Conradie <fr...@qfin.net>

>  Hi Thomas
>
> Well, I'm glad it's not a bug then! I can think of a few ways to handle
> this situation in my algorithm, so it should not be a problem. I'm just
> wondering how many other classes behave in this "unexpected" way :O
>
> Cheers,
> Frank
>
>
> On 15/03/2010 10:26 PM, Thomas Paviot wrote:
>
> Hi Frank,
>
>  This behaviour does not come from SWIG but from OpenCASCADE itself. Let
> me explain you in a few words what happens here.
>
>  The BRepPrimAPI_MakeBox class inherits from the BRepBuilderAPI_MakeShape
> one. This class provides the Shape() method you can find in
> BRepPrimAPI_Make* basic geometry constructors. If you have a look at  the
> Shape() method in the file BRepBuilderAPI_MakeShape.cxx, you will read:
>
>  """
>  //=======================================================================
> //function : Shape
> //purpose  :
> //=======================================================================
>
>  const TopoDS_Shape&  BRepBuilderAPI_MakeShape::Shape() const
> {
>   if (!IsDone()) {
>     // the following is const cast away
>     ((BRepBuilderAPI_MakeShape*) (void*) this)->Build();
>     Check();
>   }
>   return myShape;
> }
>  """
>
>  The Shape() method then returns a reference to the protected attribute
> 'myShape' of the class BRepBuilderAPI_MakeBox. In other words, if you delete
> the BRepPrimAPI_MakeBox instance, you loose the reference to the shape.
>
>  For instance:
>
>  >>> from OCC.BRepPrimAPI_MakeBox import *
> >>> from OCC.TopoDS import *
> >>> box = BRepPrimAPI_MakeBox(10,10,10)
> >>> shp  = box.Shape()
> >>> print shp.IsNull()
> 0
> >>> del box #object is garbage collected, not deleted yet
> >>> print shp.IsNull()
> 0
> >>> GarbageCollector.garbage.smart_purge() # all objects are deleted, loose
> the reference to myShape attribute
> >>> print shp.IsNull()
> 1
>
>  Then force objects deletion only if you're sure you don't need the shapes
> anymore. I don't know what you're trying to do exactly, so it's difficult to
> suggest any best practice.
>
>  Regards,
>
>  Thomas
>
> 2010/3/15 Frank Conradie <fr...@qfin.net>
>
>> Hi Thomas
>>
>> I am getting crash behaviour in the interim 0.5 PythonOCC release,
>> related to the new GarbageCollector implementation. The code below
>> crashes on my PC:
>>
>> ----------------------------------------
>> from OCC.gp import *
>> from OCC.BRepPrimAPI import *
>> from OCC.BRepBuilderAPI import *
>> from OCC.TopExp import *
>> from OCC.TopoDS import *
>>
>> o = 0.0
>> w = 0.1
>> fp1 = (o,o,o)
>> fp2 = (w,w,w)
>>
>> mkbox = BRepPrimAPI_MakeBox(gp_Pnt(fp1[0],fp1[1],fp1[2]),
>> gp_Pnt(fp2[0],fp2[1],fp2[2]))
>> s = mkbox.Shape()
>> del mkbox
>>
>> print s.ShapeType()
>> GarbageCollector.garbage.smart_purge()
>> # The next line crashes my system
>> print s.ShapeType()
>> ----------------------------------------
>>
>> It is almost as if calling _kill_pointed for the mkbox causes shape "s"
>> to become "corrupted" in some way. I dug through the SWIG code a bit,
>> but cannot see anything obviously wrong, so I was hoping you could shed
>> some light on the issue.
>>
>> By the way, I did get the SVN compiled myself as well, and get the same
>> crash with my compiled lib as well as the one you made available on your
>> website.
>>
>> Thanks,
>> Frank
>>
>>
>> _______________________________________________
>> Pythonocc-users mailing list
>> Pythonocc-users@gna.org
>> https://mail.gna.org/listinfo/pythonocc-users
>>
>
>
> _______________________________________________
> Pythonocc-users mailing 
> listpythonocc-us...@gna.orghttps://mail.gna.org/listinfo/pythonocc-users
>
>
> _______________________________________________
> Pythonocc-users mailing list
> Pythonocc-users@gna.org
> https://mail.gna.org/listinfo/pythonocc-users
>
>
_______________________________________________
Pythonocc-users mailing list
Pythonocc-users@gna.org
https://mail.gna.org/listinfo/pythonocc-users

Reply via email to