[Ovmsdev] Event task

Mark Webb-Johnson mark at webb-johnson.net
Mon Apr 9 10:08:23 HKT 2018


> do we actualy need an additional signal on notifications? What is the use case?

Purely to allow scripts to be triggered and do something.

Regards, Mark.

> On 9 Apr 2018, at 2:10 AM, Michael Balzer <dexter at expeedo.de> wrote:
> 
> Looks good. I've changed the CANopen and RT signals.
> 
> Notifications still work, their real transport does not depend on the event but is done by the NotifyReaders() callback queue. But sending the queue entry with the signal can become a race condition now if some future event listener uses that pointer.
> 
> A clean solution would be to add a reader key for event listeners that is reset by the callback -- and we also need to add some mutexes… do we actualy need an additional signal on notifications? What is the use case?
> 
> Regards,
> Michael
> 
> 
> Am 08.04.2018 um 10:54 schrieb Mark Webb-Johnson:
>> I’ve implemented this (along the lines of what we talked about).
>> 
>> I think the free could be done in the way you suggest, or alternatively I have provided an EventStdFree that you can just tack on the end of the SignalEvent call. It just frees the data.
>> 
>> I’ve also provided a variant of SignalEvent that can be provided with a size_t for the data. That variant clones the data, and defines a cleanup function to free it.
>> 
>> Implementation seems ok. Stack usage looks fine:
>> 
>> OVMS# module tasks
>> Number of Tasks = 17      Stack:  Now   Max Total    Heap 32-bit SPIRAM
>> 3FFAFB48  1 Blk esp_timer         388   580  4096   38080    644  21756
>> 3FFBDD5C  2 Blk eventTask         440  1768  4608       0      0      0
>> 3FFBFB58  3 Blk OVMS Events       436  3780  6144   86916      0   6800
>> 3FFC4794  4 Blk OVMS CanRx        432   432  1024       0      0      0
>> 3FFC884C  5 Blk ipc0              392   440  1024    7776      0      0
>> 3FFC8E4C  6 Blk ipc1              392   440  1024      12      0      0
>> 3FFCAC74  9 Rdy IDLE              368   496  1024       0      0      0
>> 3FFCB208 10 Rdy IDLE              356   484  1024       0      0      0
>> 3FFCBF9C 11 Blk Tmr Svc           392   680  3072       0      0      0
>> 3FFCF9F4 16 Blk tiT               492  2348  3072     740      0   5868
>> 3FFD5CA4 17 Blk OVMS SIMCOM       464  2496  4096    4400      0      0
>> 3FFD7C54 18 Blk wifi              432  2304  4096     304      0   1708
>> 3FFDA3EC 19 Blk pmT               408  1672  2560       0      0      0
>> 3FFDAA04 20 Blk OVMS Vehicle      452   452  3072       0      0      0
>> 3FFDEC24 21 Rdy OVMS Console      760  2600  6144      20  15488  12000
>> 3FFDF604 22 Blk mdns              412  1732  4096     104      0      4
>> 3FFE3118 23 Blk OVMS NetMan       728  2392  7168    1528      0     68
>> 
>> It solves my problem with scripts on SD CARD mount for v3.1 hardware.
>> 
>> I’ve committed it as is, and fixed most uses of SignalEvent I could find. There are some in the canopen and RT code that I’ve left for @michael.
>> 
>> I don’t think notifications will work correctly now because they seem to rely on the SignalEvent returning after all the handlers have processed the event (no longer the case). I’m guessing that needs to be changed to use the DoneFN as a callback.
>> 
>> Can you guys have a review of it? I must prefer to run this stuff in one task (Event), but this is a large change and could break a bunch of stuff.
>> 
>> Regards, Mark.
>> 
>>> On 8 Apr 2018, at 3:27 PM, Michael Balzer <dexter at expeedo.de <mailto:dexter at expeedo.de>> wrote:
>>> 
>>> 
>>> Am 07.04.2018 um 15:23 schrieb Michael Balzer:
>>>> Another idea that can solve both issues: SignalEvent(event, data, [DoneCallback])
>>>> 
>>>> DoneCallback(event, data) would be called by the EventTask after listener execution has finished. The callback can implement memory cleanup and/or synchronous
>>>> processing (i.e. by a semaphore or task signal) as needed.
>>> 
>>> C++ now also has a nice lambda construct with very simple capturing of arbitrary scope parts by copy or reference. That enables nice inline callback definitions
>>> like this:
>>> 
>>>     char *data = strdup(message);
>>>     MyEvents.SignalEvent("simple.event", (void*)data, [data](){ free(data); });
>>> 
>>> …or…
>>> 
>>>     SomeObject *clone = new SomeObject(original);
>>>     MyEvents.SignalEvent("object.event", (void*)clone, [clone](){ delete clone; });
>>> 
>>> Regards,
>>> Michael
>>> 
>>> -- 
>>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
>>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
>>> 
>>> 
>>> _______________________________________________
>>> OvmsDev mailing list
>>> OvmsDev at lists.openvehicles.com <mailto:OvmsDev at lists.openvehicles.com>
>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
>> 
>> 
>> 
>> _______________________________________________
>> OvmsDev mailing list
>> OvmsDev at lists.openvehicles.com <mailto:OvmsDev at lists.openvehicles.com>
>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
> 
> -- 
> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
> _______________________________________________
> OvmsDev mailing list
> OvmsDev at lists.openvehicles.com
> http://lists.openvehicles.com/mailman/listinfo/ovmsdev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openvehicles.com/pipermail/ovmsdev/attachments/20180409/e0ff0ec7/attachment.htm>


More information about the OvmsDev mailing list