On Sat, Oct 23, 2010 at 23:41, Marco Rogers <[email protected]> wrote:
> Anton, what do you mean by "API functions.."? Which part of his above
> example are you referring to? I admit I'm still not sure what's wrong
> with what Rasmus is doing.
I believe what Anton is saying is that an object created in C-land
will not be subject to GC.
Here, we create (i.e. allocate) a Function object using the C++ API:
HandleScope scope;
Local<Function> fun = Local<Function>::New(...);
Persistent<Function> phandle = Persistent<Function>::New(fun);
phandle.MakeWeak(data, &FinalizationCallback)
If I understand Anton correctly, this function will never be garbage
collected thus FinalizationCallback never called. Anton, is that
correct?
And the case v8 create the object for us:
HandleScope scope;
Local<Value> v = EvalHelper("function(){}");
Local<Function> fun = Local<Function>::Cast(v);
Persistent<Function> phandle = Persistent<Function>::New(fun);
phandle.MakeWeak(data, &FinalizationCallback)
But in this case FinalizationCallback will be called.
Is this correct?
>
> Thanks
> :Marco
>
> On Oct 22, 10:52 am, Anton Muhin <[email protected]> wrote:
>> Rasmus,
>>
>> API functions are cached and are never collected, hence the object
>> managed by handle is never collected hence weak callback is never
>> invoked.
>>
>> hth and yours,
>> anton.
>>
>>
>>
>> On Fri, Oct 22, 2010 at 6:31 PM, Rasmus Andersson <[email protected]> wrote:
>> > On Fri, Oct 22, 2010 at 16:24, Stephan Beal <[email protected]> wrote:
>> >> On Fri, Oct 22, 2010 at 4:15 PM, Rasmus Andersson <[email protected]>
>> >> wrote:
>>
>> >>> void *data = NULL; // points to something in reality
>> >>> phandle.MakeWeak(data, &WeakCallback);
>>
>> >> It would really surprise me if MakeWeak() does anything useful when
>> >> passed a
>> >> NULL pointer. If you just need a pointer to test with, the approach i like
>> >> is:
>> >> static int x = 42;
>> >> void * data = &x;
>>
>> > I am passing a pointer to some heap allocated memory in my actual
>> > implementation. I just removed that part in the mail. Sorry for the
>> > confusion.
>>
>> >>> The "Handler" gets called as expected, but "WeakCallback" is never
>> >>> called.
>>
>> >>> Any ideas?
>>
>> >> AFAIK, v8 never guarantees that the WeakCallback will _ever_ be called.
>> >> Even
>> >> when v8 shuts down, it might just quit without calling the destructors. It
>> >> was explained once on this mailing list (a year or more ago) that that is
>> >> for performance reasons in the Chrome browser, to avoid a long cleanup
>> >> phase
>> >> when the app is exiting and will be cleaned up by the OS. (i don't agree
>> >> that the behaviour is correct, because it fails to recognize that
>> >> destructors must be called for proper cleanup, but it's not my code.)
>>
>> > I've created a test program which calls createAndCallAFunction() 1000
>> > times per event loop, thus reaching ~1GB residential memory within a
>> > few seconds. I guess at least one of the millions of objects created
>> > should be GC:ed?
>>
>> > After hitting approx. 1GB res, memory usage stabilizes, so I guess v8
>> > DO reuse memory (so no refcounter leak I guess).
>>
>> > Most examples (including Ryan Dahls/Node.js ObjectWrapper) operate on
>> > Object and ObjectTemplate, but in my case it's a Function (which is a
>> > subclass of Object, but have a separate Template class).
>>
>> >> --
>> >> ----- stephan beal
>> >>http://wanderinghorse.net/home/stephan/
>>
>> >> --
>> >> v8-users mailing list
>> >> [email protected]
>> >>http://groups.google.com/group/v8-users
>>
>> > --
>> > Rasmus Andersson
>>
>> > --
>> > 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
>
--
Rasmus Andersson
--
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users