Thank you!  I'll give it a go!
On Mar 29, 2016 4:27 AM, "Jochen Eisinger" <[email protected]> wrote:

> The C++ class corresponding to Engine should have a v8::Global that
> references the JS representation of the ComponentMesh. That way, the Engine
> will keep the ComponentMesh alive as long as the C++ side is alive.
>
> Note that this will potentially create a cycle through C++ which V8's GC
> cannot detect: C++ Engine - (via v8::Global) -> mesh -> creation context ->
> root - (via another global handle) -> C++ Engine, and you will have to
> manually break this cycle for garbage collection to collect it.
>
> On Mon, Mar 28, 2016 at 5:10 PM Scott Duensing <[email protected]>
> wrote:
>
>> You're right, of course.  I figured this out as soon as I posted.  Doh!
>>
>> Which brings up the next question...
>>
>> What's the *proper* way to keep 'mesh' alive?  I hate to keep a global JS
>> variable for everything I create from the C++ side.  I also hate to pass
>> copies of objects when a pointer is really what I want.
>>
>>
>> Scott
>>
>>
>>
>>
>>
>> On Thursday, March 24, 2016 at 1:51:30 AM UTC-5, Jochen Eisinger wrote:
>>
>>> It looks like mesh is collected, not root. How does root keep mesh alive?
>>>
>>> On Wed, Mar 23, 2016, 9:20 PM Scott Duensing <[email protected]>
>>> wrote:
>>>
>> I've been working on a game engine and using V8 as the embedded
>>>> language.  Everything has been going fairly well, using SWIG to wrap native
>>>> C++ classes for use in JS.
>>>>
>>>> Until today.
>>>>
>>>> My test code creates a triangle in JavaScript and sends it to the
>>>> engine to be rendered.  It works.  For about 5 seconds.  Then the 'root'
>>>> object of my scene gets garbage collected by V8 and I'm not sure why.  I
>>>> set a breakpoint when the object is destroyed and captured a stack trace:
>>>>
>>>> 0    ComponentMesh::~ComponentMesh    componentMesh.cpp    18
>>>> 0x4cd39e
>>>> 1    ComponentMesh::~ComponentMesh    componentMesh.cpp    19
>>>> 0x4cd472
>>>> 2    _wrap_delete_ComponentMesh    componentMesh_wrap.cpp    1788
>>>> 0x435c46
>>>> 3    v8::internal::GlobalHandles::Node::PostGarbageCollectionProcessing
>>>> (v8::internal::Isolate *)            0x6a7fee
>>>> 4    v8::internal::GlobalHandles::PostScavengeProcessing(int)
>>>>    0x6a7e75
>>>> 5    v8::internal::GlobalHandles::PostGarbageCollectionProcessing(v8::
>>>> internal::GarbageCollector, v8::GCCallbackFlags)            0x6a86ba
>>>> 6    v8::internal::Heap::PerformGarbageCollection(v8::internal::
>>>> GarbageCollector, v8::GCCallbackFlags)            0x6afa77
>>>> 7    v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollector,
>>>> const char *, const char *, v8::GCCallbackFlags)            0x6af054
>>>> 8    v8::internal::Factory::NewRawOneByteString(int, v8::internal::
>>>> PretenureFlag)            0x68677d
>>>> 9    v8::internal::Factory::NewStringFromUtf8(v8::internal::Vector<char
>>>> const>, v8::internal::PretenureFlag)            0x686bb0
>>>> 10    v8::String::NewFromUtf8(v8::Isolate *, const char *, v8::
>>>> NewStringType, int)            0x4d00ea
>>>> 11    ScriptInstance::update    scriptInstance.cpp    179    0x41d744
>>>> 12    Scripting::update    scripting.cpp    219    0x41609c
>>>> 13    main    main.cpp    70    0x4b2331
>>>>
>>>>
>>>>
>>>> As you can see, my scripting system calls update() in the JS code which
>>>> should call render() back in the engine.  Except the mesh is being GCed
>>>> before that happens.  The JS is:
>>>>
>>>> "use strict";
>>>>
>>>> var root;
>>>>
>>>> function startup(scriptId) {
>>>>     var mesh = new ComponentMesh("triangle");
>>>>     mesh.addVertex(new Vertex(-1.0, -1.0, 0.0));
>>>>     mesh.addVertex(new Vertex( 1.0, -1.0, 0.0));
>>>>     mesh.addVertex(new Vertex( 0.0,  1.0, 0.0));
>>>>     mesh.addIndex(0);
>>>>     mesh.addIndex(1);
>>>>     mesh.addIndex(2);
>>>>
>>>>     root = new Entity("root");
>>>>     root.addComponent(mesh);
>>>> }
>>>>
>>>> function update(delta, event) {
>>>>     Engine.render(root);
>>>> }
>>>>
>>>> function shutdown() {
>>>> }
>>>>
>>>>
>>>> Why is 'root' being GCed?  The context for this script is Persistent<>
>>>> and I don't call Destroy()/Reset().
>>>>
>>>> The entire codebase is available to browse at
>>>> http://skunkworks.kangaroopunch.com/projects/magrathea/repository
>>>>
>>>> Help?  Please?  Thanks!
>>>>
>>>>
>>>> Scott
>>>>
>>>>
>>>> --
>>>> --
>>>> v8-users mailing list
>>>>
>>> [email protected]
>>>
>>>
>>>> http://groups.google.com/group/v8-users
>>>> ---
>>>> You received this message because you are subscribed to the Google
>>>> Groups "v8-users" group.
>>>>
>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>
>>>
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> --
>> --
>> v8-users mailing list
>> [email protected]
>> http://groups.google.com/group/v8-users
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "v8-users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> For more options, visit https://groups.google.com/d/optout.
>>
> --
> --
> v8-users mailing list
> [email protected]
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "v8-users" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/v8-users/PYxVvgjAi24/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to