Bugs item #1868911, was opened at 2008-01-10 23:29 Message generated for change (Comment added) made by dooglus You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=757416&aid=1868911&group_id=144022
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: Crasher/nasty bug Group: SVN version Status: Open Resolution: None Priority: 5 Private: No Submitted By: Genete (genete) Assigned to: Nobody/Anonymous (nobody) Summary: Exported canvases and its layers still not deleted Initial Comment: Using svn 1316 1) File New. Default setiings 2) New Circle 3) Encapsulate 4) Export canvas parameter 5) close Synfigstudio 6) Save? (no) And the console says: Application appears to have terminated successfully synfig(14397) [22:45:15] error: 1 canvases not yet deleted! synfig(14397) [22:45:15] error: 1 layers not yet deleted! That's related with other bug I wrote: https://sourceforge.net/tracker/?func=detail&aid=1848018&group_id=144022&atid=757416 -G ---------------------------------------------------------------------- >Comment By: dooglus (dooglus) Date: 2008-02-01 16:01 Message: Logged In: YES user_id=1546005 Originator: NO I found a solution. CanvasInterface::generate_param_list() in canvasinterface.cpp was putting the ValueBase object onto its param_list, where it was staying while the canvas was changed from inline to exported, after which it forgot that it needed to be unref()ed. So rather than putting the ValueBase onto the param_list, I'm putting a Canvas::LooseHandle there instead: if (value_desc.get_value_type() == ValueBase::TYPE_CANVAS) param_list.add("value", Canvas::LooseHandle(value_desc.get_value(). get(Canvas::LooseHandle()))); else param_list.add("value",value_desc.get_value()); ---------------------------------------------------------------------- Comment By: dooglus (dooglus) Date: 2008-02-01 12:54 Message: Logged In: YES user_id=1546005 Originator: NO I've been looking into this, and it's quite tricky. The ValueBase class can hold various types (all 13 of Synfig's value types). This includes canvases as one of the types. When: ValueBase::set(Canvas* x) is used to set the value of a ValueBase object to be a canvas pointer, one of the following is done: if(x && x->is_inline()) _set(etl::handle<Canvas>(x)); else _set(etl::loose_handle<Canvas>(x)); so whether or not the canvas' refcount is incremented depends on whether the canvas is inline *at the moment*. Similarly when we put a loose_handle<Canvas> or a handle<Canvas> into a ValueBase - we convert both types to handle<Canvas>(x) (if inline) or to loose_handle<Canvas>(x) (otherwise). Then, later, when we've finished with the ValueBase, we ValueBase::clear() it's value, and if it's a canvas value: etl::handle<Canvas> canvas(get(etl::loose_handle<Canvas>())); if(canvas && canvas->is_inline()) delete static_cast<etl::handle<Canvas>*>(data); else delete static_cast<etl::loose_handle<Canvas>*>(data); ie. we unreference it only if it is inline now. Well, the problem is what happens if a canvas wasn't inline when you put it into the ValueBase, but it IS inline when you clear the ValueBase later? You ref but never unref, the refcount never goes below 1 and the "canvas not yet deleted" on exit. (the "layer not yet deleted" is probably because the canvas is holding a reference to it - fix the canvas problem & the layer problem gets fixed too). Do we need to adjust the count when changing a value from inline to exported? Or keep the two types of value (inline and not) in different types of ValueBase? ---------------------------------------------------------------------- Comment By: Genete (genete) Date: 2008-01-11 10:51 Message: Logged In: YES user_id=1874777 Originator: YES File Added: blinepoint_icon.sif ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=757416&aid=1868911&group_id=144022 ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Synfig-devl mailing list Synfig-devl@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/synfig-devl