Istvan,

I reproduced the issue (segfault or leak). Try with the following
force_purge() method:
    def force_purge(self):
        while len(self._transients)>0:
            transient = self._transients.pop()
            transient._kill_pointed()
            transient.was_purged = True
        while len(self._misc)>0:
            misc = self._misc.pop()
            misc._kill_pointed()
            misc.was_purged = True
        while len(self._handles)>0:
            handle = self._handles.pop()
            handle.was_purged = True

With MMGT_OPT=1, MMGT_OPT=2 or undefined MMGT_OPT, this should do the job
(no crash, no leak). It's a tweak however, it seems that the smart_purge()
method conflicts with the OCC StackManager. I need to dig into this issue. I
will soon push a tp/memory-mgt-improvements branch to the github repos, stay
tuned.

Thomas

2011/10/1 István Csanády <istvancsan...@gmail.com>

> I have installed OCE 0.6.0, and the pythonocc current master, still the
> previous problem: with force_purge() it crashes with smart_purge() it leaks.
> Check the attached code.
>
>
> On Fri, Sep 30, 2011 at 3:33 PM, Thomas Paviot <tpav...@gmail.com> wrote:
>
>> The OCC API changed between 6.3.0 and 6.5.1. As a consequence, pythonocc
>> SWIG files were updated to be consistent with the new API. You need OCC6.5.1
>> or OCE-0.6.0 to be able to run pythonocc current master.
>>
>> Thomas
>>
>>
>> 2011/9/30 István Csanády <istvancsan...@gmail.com>
>>
>>> I was going to rebulid pythonocc 0.5 with OCE 0.6.0 to try to check if
>>> the code I sent does still crash or not with 0.6.0, but it misses
>>> BinLPlugin. Do I have to download the latest pythonocc version to build with
>>> OCE?
>>>
>>> On Fri, Sep 30, 2011 at 11:13 AM, Thomas Paviot <tpav...@gmail.com>wrote:
>>>
>>>> 2011/9/30 D. Barbier <bou...@gmail.com>
>>>>
>>>>> On 2011/9/30 István Csanády wrote:
>>>>> > Thanks Thomas, this solved the leaking issue. Any ideas for a
>>>>> workaround for
>>>>> > the MMGrOpt crash (when I don't remove gcurve.GetObject())? Or I will
>>>>> have
>>>>> > to wait for pyocc 0.6?
>>>>>
>>>>> Hello,
>>>>>
>>>>> Can you please check whether your crash happens with OCE 0.6.0?  We
>>>>> fixed a bug which looks similar, so maybe it is gone.
>>>>> If it crashes, how can I reproduce it?  I tried your
>>>>> example_GC_istvan.py file with MMGT_OPT set to 0, but it does not
>>>>> crash.
>>>>>
>>>>
>>>> On OSX/pythonocc current master/OCE-0.6.0, crash with MMGT_OPT=0,
>>>> MMGT_OPT=2 but succeed with MMGT_OPT=1.
>>>>
>>>>
>>>>>
>>>>> > Last night I have been profiling some pythonocc code and I have
>>>>> noticed that
>>>>> > collect_object is a quite slow even if I remove logging. Probably it
>>>>> has
>>>>> > some potential to increase pythonocc's performance. Since it is
>>>>> always
>>>>> > called when an object is destructed it makes sense to remove somehow
>>>>> the
>>>>> > costly string compares for the Handle objects. For example if it is
>>>>> possible
>>>>> > in OCE in the Handle class generator (handle classes are generated
>>>>> > automatically, aren't they?) can be modified that every Handle class
>>>>> should
>>>>> > subclass from an empty marker class (eg. class HandleMarkerClass{})
>>>>> and this
>>>>> > can be used in the GC by checking only
>>>>> > isinstance(obj_deleted,HandleMarkerClass), removing
>>>>> > the obj_deleted.__class__.__name__.startswith('Handle').
>>>>>
>>>>> AFAICT all handles derive from either Handle_Standard_Transient or
>>>>> Handle_Standard_Persistent, so your solution can be implemented
>>>>> without changes in C++ code.
>>>>>
>>>>> > The hasattr calls
>>>>> > might also can be replaced by some tricky way but I don't know if it
>>>>> worth
>>>>> > it but I think it does since hasattr searches in a python dictionary
>>>>> which
>>>>> > is a hashmap and a single isinstance is might be less costly than a
>>>>> dict
>>>>> > lookup. But replacing somehow the string compare IMO would definitely
>>>>> worth
>>>>> > it.
>>>>> > But these are only ideas I don't know OCC's structure very well.
>>>>>
>>>>> I guess that
>>>>>  hasattr(obj_deleted,"GetHandle")
>>>>> can be replaced by
>>>>>  isinstance(deleted, OCC.Standard.Standard_Transient) or
>>>>> isinstance(deleted, OCC.Standard.Standard_Persistent)
>>>>>
>>>>
>>>> Absolutely. That's what I implemented in my previous attachment.
>>>>
>>>>
>>>>>
>>>>> Denis
>>>>>
>>>>
>>>> Thomas
>>>>
>>>>
>>>> _______________________________________________
>>>> 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
>>>
>>>
>>
>> _______________________________________________
>> 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
>
>
_______________________________________________
Pythonocc-users mailing list
Pythonocc-users@gna.org
https://mail.gna.org/listinfo/pythonocc-users

Reply via email to