weak_ref issue
Max McGuire <[email protected]>
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <[email protected]> |
I've discovered an issue in the implementation weak_ref. The issue is due to the way the Lua garbage collector works. Namely, an element can be removed from a weak table in a garbage collection cycle without the __gc metamethod being called on the element being removed. The result is that the weak reference connection between an wrap_base derived class and its object_rep can be lost. Here's what happens: object_rep A is created and wrap_base A stores a weak reference to it. This reference is stored in slot 10 of the weak table. ..... object_rep A is no longer in use an becomes garbage. The garbage collector runs far enough to remove the reference to object_rep A in the weak table. object_rep B is created and wrap_base B stores a weak reference to it. Slot 10 in the weak table is now empty so the reference to B is stored in slot 10. The garbage collector runs and invokes the __gc method for object_rep A. This destroys wrap_base A, which in turn destroys the weak_ref and calls luaL_unref on slot 10 of the weak table Now wrap_base B now longer has a valid reference for object_rep B. I've attached a simple program that demonstrates the behavior of the garbage collector in Lua. Because I'm not very familiar with all of the details of luabind, I'm not sure how to proceed with fixing this issue. Any advice would be appreciated. Thanks, Max -- Technical Director Unknown Worlds Entertainment http://www.unknownworlds.com ------------------------------------------------------------------------------ This SF.net email is sponsored by Sprint What will you do first with EVO, the first 4G phone? Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first _______________________________________________ luabind-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/luabind-user
main.cpp
(application/octet-stream, 1.8 KB) - not displayed