kelbelj at fel.cvut.cz
Mon May 25 18:06:55 CEST 2009
I have access to Linux, so I will check the program with valgrind.
Concerning the crash of notice call, it happens only when it is called
from copy constructor of the propagator, which I did not see in any
propagator in Gecode.
Some info from the debugger (which I don't understand since I do not
know Gecode deep inside) :
Assertion failed: n != 0, file
re.cpp, line 125
//in method Space::d_resize(void)
unsigned int n = static_cast<unsigned int>(d_lst - d_fst);
assert(n != 0); //line 125
and debugger shows d_lst == d_fst == 0xcdcdcdcd
Christian Schulte napsal(a):
> Hmm, sounds weird. Do you use Linux, then you could use the valgrind tool
> for tracking memory leaks.
> But then, why does the call to notice crash? It very definitely shouldn't.
> Christian Schulte, www.ict.kth.se/~cschulte/
> -----Original Message-----
> From: Jan Kelbel [mailto:kelbelj at fel.cvut.cz]
> Sent: Monday, May 25, 2009 5:24 PM
> To: Christian Schulte
> Subject: Re: [gecode-users] Propagator
> I did it too, with no real effect (the memory used by the process grows
> by 1MB/s, and for job-shop 8 machines x 8 tasks there are 8 edge-finder
> propagators, each with SharedArray<Int> of size 8).
> I did not use home.notice(*this,AP_DISPOSE) in copy constructor - it
> caused crash of the process - but it is neither used in copy
> constructors in Gecode.
> Christian Schulte napsal(a):
>> For a SharedArray, you have to manually call its destructor in the dispose
>> method and you have to use notice/ignore as described before.
>> For an example, see gecode/element/int.hpp
>> Christian Schulte, www.ict.kth.se/~cschulte/
>> -----Original Message-----
>> From: Jan Kelbel [mailto:kelbelj at fel.cvut.cz]
>> Sent: Monday, May 25, 2009 5:08 PM
>> To: Christian Schulte
>> Cc: users at gecode.org
>> Subject: Re: [gecode-users] Propagator
>> Hi Christian,
>> thank you for the answer. From the things you described (and I already
>> tried, though I not really knew what it is doing), it must be something
>> else. The propagator has one array created in propagate() method using
>> Region allocator, that should be freed automatically when the
>> propagate() returns, and one SharedArray that is shared among all the
>> copies of one propagator.
>> Regards, Jan
>> Christian Schulte napsal(a):
>>> Hi Jan,
>>> there are the following catches:
>>> a) propagators do not use destructors. Instead, when a propagator is
>>> deleted, the dispose function is called. That in particular implies that
>>> any member of your propagator you have to explicitly call the member's
>>> destructor (that is something that is done automatically inside a
>>> but not in the dispose function).
>>> b) most likely you are under the assumption that when a space containing
>>> your propagator is deleted, the dispose method of the propagator is
>>> such that memory possibly allocated by your propagator is freed. That is
>>> the case. In case your propagator requires the dispose method to be
>>> when a space is deleted, the propagator must register itself with its
>>> for deletion. For example, when home refers to the space, you have to
>>> register the propagator by
>>> home.notice(*this, AP_DISPOSE);
>>> and consequently in the dispose function you have to deregister
>>> home.ignore(*this, AP_DISPOSE);
>>> The only exception is if your propagator has only allocated memory from
>>> space but not via malloc or something else. Then it does not be deleted
>>> its space is deleted.
>>> Then, the behaviour you describe must have to do with something else as
>>> there is really nothing special happening for NaryPropagator. Maybe you
>>> could check your code again.
>>> I think you are referring to the Gecode 2.* implementation of the
>>> cumulatives propagator. That was actually nonsensical and has been
>>> in 3.*. If no variables are modified by a propagator and the propagator
>>> ES_NOFIX, Gecode still knows that nothing has changed. So finding out
>>> whether something has changed, and if yes reporting ES_NOFIX and ES_FIX
>>> otherwise is exactly the same than reporting ES_NOFIX.
>>> I hope that helps
>>> Christian Schulte, www.ict.kth.se/~cschulte/
More information about the gecode-users