@Michael this is probably for you.
I am trying to implement javascript command
registration. The idea is that a javascript module can call
something like:
OvmsCommand.Register(basecommand, name, title,
callbackfn, usage, min, max)
Then we reflect that into MyCommandApp.RegisterCommand,
and keep a track of which command is for which javascript
callbackfn. When the command is executed, we pass it into
duktape.
I also have tracking for javascript module loading and
unloading, so I can DeregisterCommand() if duktape is reloaded
(and also protected against commands being registered in
short-lived scripts run from the command line).
To implement this, I need to store the callbackfn as a
persistent reference to a duktape javascript function.
The issue with callback function references in
duktape is summarised here:
When a Duktape/C function is called,
Duktape places the call arguments on the value stack. While
the arguments are on the value stack, they're guaranteed to
be reachable and the Duktape/C function can safely work with
the arguments.
However, when the Duktape/C function returns, the value
stack is unwound and references in the function's value
stack frame are lost. If the last reference to a particular
value was in the function's value stack frame, the value
will be garbage collected when the function return is
processed.
The standard approach is to store the reference back
in the duktape duk_push_global_stash so it won’t get
garbage-collected. But, that seems messy.
I see that Michael has already implemented something
that seems similar in ovms_script.{h, cpp}, for the async http
callbacks. Presumably to avoid this issue. But, the approach
seems very different, and I am not sure if it is stopping _all_
garbage collection for the duration of the async query, or just
that particular object being garbage collected. The work seems
extensive (quite a few objects involved).
So @Michael, any suggestions for this? I don’t want
to reinvent the wheel...
Regards, Mark.
_______________________________________________
OvmsDev mailing list
OvmsDev@lists.openvehicles.com
http://lists.openvehicles.com/mailman/listinfo/ovmsdev