<div dir="ltr"><div>Hi Hannes,</div><div><br></div><div>Thanks for detailing the issue so clearly.  On a first pass it would seem like your suggesting of changing to observer_ptr<> would be appropriate.  I'll need to properly review it, though I'm working flat out on the VSG right now so can't jump in right away.  Could you make a PR for your fix, then once I get a breather from the VSG work can jump in a test out the issue and the solution.<br></div><div><br></div><div>Cheers,<br></div><div>Robert.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 19 Sep 2019 at 22:29, Hannes Pabst <<a href="mailto:johannes.pabst@ocilion.com">johannes.pabst@ocilion.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Consider the following Lua script&#058;<br>
<br>
<br>
Code:<br>
<br>
function makeObjectWithCallback()<br>
   local object = new "osg::Object"<br>
<br>
   function object:process()<br>
         print "Hello"<br>
   end<br>
<br>
   return object<br>
end<br>
<br>
<br>
<br>
<br>
The function makeObjectWithCallback will create an osg::Object which has a LuaCallbackObject named "process", stored within its user data.<br>
The LuaCallbackObject itself stores an ref_ptr to the LuaScriptEngine for being able to call the function defined within Lua.<br>
Unfortunately the references now are circular: <br>
<br>
LuaScriptEngine -> Lua -> Object -> LuaCallbackObject -> LuaScriptEngine<br>
<br>
Once the script is executed it is hard to get rid of the LuaScriptEngine object.<br>
Simply deleting all references to the ScriptEngine and the returned Object on the cpp side will cause a leak, as the Lua state keeps them alive.<br>
Even if the variable "object" above is only temporarily used in Lua, a GC run is necessary to break the Lua -> Object dependency.<br>
But who shall trigger that, if all references on the cpp side are gone and Lua cannot be called anymore?<br>
<br>
Here is the code to run the Lua script above, that will produce the leak:<br>
<br>
<br>
Code:<br>
<br>
void runScript()<br>
{<br>
   osg::ref_ptr<osg::ScriptEngine> luaScriptEngine = osgDB::readFile<osg::ScriptEngine>("ScriptEngine.lua");<br>
   osg::ref_ptr<osg::Script> script = osgDB::readScriptFile("script.lua");<br>
   osg::Parameters inputParameters;<br>
   osg::Parameters outputParameters;<br>
   luaScriptEngine->run(script.get(), "makeObjectWithCallback", inputParameters, outputParameters);<br>
}<br>
<br>
<br>
<br>
<br>
My intention is to use LuaCallbackObjects but also to have the possibility to clean up and reload the Lua script at any time by re-instantiating the LuaScriptEngine. <br>
Unfortunately there seems to be no general and easy way to destroy the shared LuaScriptEngine object. <br>
<br>
Wouldn't it be a more practical design to have the LuaCallbackObject only weakly reference the LuaScriptEngine?<br>
If the ScriptEngine object is gone, callbacks into Lua could simply do nothing – per definition.<br>
I understand such change would break existing code, in situations where one creates a LuaScriptEngine object on the fly running a script that hooks to the OSG runtime system.<br>
As far as I understand the Lua plugin code, the lua_close call in the destructor of LuaScriptEngine releases all references held by Lua and thus would be able break up all other eventually existing circular references - so the class would in principle be ready to act as a “master object” on the cpp side, that is able to control the lifetime of the whole Lua system.<br>
<br>
I have made this change to the Lua plugin code (simply by replacing the ref_ptr by an observer_ptr) and for my purposes it seems to work well, but wonder if this is an issue that should generally be addressed within OSG.<br>
<br>
------------------<br>
Read this topic online here:<br>
<a href="http://forum.openscenegraph.org/viewtopic.php?p=76703#76703" rel="noreferrer" target="_blank">http://forum.openscenegraph.org/viewtopic.php?p=76703#76703</a><br>
<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org" target="_blank">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" rel="noreferrer" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
</blockquote></div>