Okay, it seems like the best way forward is just to null the pointer I'm storing inside the object, that's cheaper and easier than managing persistent handles myself.
On Wed, Dec 2, 2009 at 12:47 AM, Anton Muhin <[email protected]> wrote: > And BTW, another way to solve the issue: you can create another > (strong) handle to the same object which should prevent it from being > 'released' and GCed. That has memory and performance penalty though. > > yours, > anton. > > On Tue, Dec 1, 2009 at 4:18 PM, Anton Muhin <[email protected]> wrote: > > On Tue, Dec 1, 2009 at 3:56 PM, Abdulla Kamar <[email protected]> > wrote: > >> It still doesn't seem to work for me, here's the exact code I use: > >> > >> v8::Handle< v8::Object > handle( v8::Object::Cast( *value ) ); > >> v8::Persistent< v8::Object >( handle ).ClearWeak(); > >> > >> "value" is a "const v8::Handle< v8::Value >&" that I get from a "const > >> v8::Arguments&" to a function. The value is previously created as a > >> Persistent from another function. Using the code from above, the > callback > >> for the weak reference is still being run on GC. > > > > I don't remember immediately, but if you got it via Arguments, it > > could be saved into a local handle. Even if it's not a case right > > now, I doubt v8 would ever guarantee you that. So to clear weakness > > flag you need to access that persistent handle, sorry. There might be > > some hacky ways like storing a pointer to the handle into the object > > itself, or, e.g. as Chromium does it---maintain an additional map > > from, say, DOM objects to _unique_ persistent handles. > > > > hth and yours, > > anton. > > > >> > >> 2009/12/1 Søren Gjesse <[email protected]> > >>> > >>> Sorry for the confusion I you should use the Persistent constructor to > >>> cast a Handle to Persistent when the Handle refers to a Persistent. > >>> Handle<Object> x > >>> ... // x is know to be a persistent handle. > >>> Persistent<Object>(x).ClearWeak(); > >>> In the following sample the callback XXXCallback will never be called. > >>> void XXXCallback(v8::Persistent<v8::Value> handle, void*) { > >>> printf("XXX\n"); > >>> handle.Dispose(); > >>> } > >>> void ClearWeak(v8::Handle<v8::Object> handle) { > >>> v8::Persistent<v8::Object>(handle).ClearWeak(); > >>> } > >>> > >>> void main(...) { > >>> v8::HandleScope scope; > >>> ... // Create and enter context. > >>> v8::Persistent<v8::Object> handle; > >>> { > >>> v8::HandleScope scope; > >>> handle = v8::Persistent<v8::Object>::New(v8::Object::New()); > >>> handle.MakeWeak(NULL, XXXCallback); > >>> } > >>> ClearWeak(handle); > >>> .. // More stuff eventually causing GC. > >>> } > >>> > >>> Regards, > >>> Søren > >>> On Tue, Dec 1, 2009 at 12:16, Abdulla Kamar <[email protected]> > >>> wrote: > >>>> > >>>> I assumed that you could construct a persistent directly, as the > header > >>>> has the following statement for the persistent constructor that takes > a > >>>> handle: > >>>> > >>>> "Casts" a plain handle which is known to be a persistent handle to a > >>>> persistent handle. > >>>> > >>>> The cast for a persistent takes a persistent, and the persistent > >>>> construct that takes a handle requires is explicit, so I did the > following: > >>>> > >>>> v8::Persistent< v8::Object > persistent( v8::Object::Cast( *value ) ); > >>>> v8::Persistent< v8::Object >::Cast( persistent ).ClearWeak(); > >>>> > >>>> But that doesn't seem to work. Instead, I've just set the pointer > stored > >>>> in the object to null, which seems to work for now but feels like a > hack. > >>>> -- > >>>> Thank you > >>>> Abdulla > >>>> > >>>> -- > >>>> v8-users mailing list > >>>> [email protected] > >>>> http://groups.google.com/group/v8-users > >>> > >>> -- > >>> v8-users mailing list > >>> [email protected] > >>> http://groups.google.com/group/v8-users > >> > >> > >> -- > >> Thank you > >> Abdulla > >> > >> -- > >> v8-users mailing list > >> [email protected] > >> http://groups.google.com/group/v8-users > > > > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > -- Thank you Abdulla -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
