On Mon, Apr 18, 2016 at 09:43:35AM -0700, Christopher Collins wrote:
> On Mon, Apr 18, 2016 at 09:18:16AM -0700, will sanfilippo wrote:
> > For #2, my only “concerns” (if you could call them such) are:
> > * Using OS_EVENT_TIMER as opposed to some other event. Should all
> > OS_EVENT_TIMER events be caused by a timer? Probably no big deal… What
> > events are going to be processed here? Do you envision many host
> > events?
> 
> Yes, I agree.  I think a more appropriate event type would be
> OS_EVENT_CALLBACK or similar.  I am a bit leery about adding a new OS
> event type for this case, because it would require all applications to
> handle an extra event type without any practical benefit.  Perhaps
> mynewt could relieve this burden with an "os_handle_event()" function
> which processes these generic events.  My concern there is that
> applications may want to add special handling for certain event types,
> so they wouldn't want to call the helper function anyway.
> 
> The OS events that the host would generate are:
>     * Incoming ACL data packets.
>     * Incoming HCI events.
>     * Expired timers.

(I meant "process", not "generate"!)

Oops... I went down a rabbit hole and forgot to address the main point
:).  What we would *really* want here is something like:
    * BLE_HS_EVENT_ACL_DATA_IN
    * BLE_HS_EVENT_HCI_EVENT_IN

However, the issue here is that the event type IDs are defined in a
single "number-space".  If the host package reserves IDs for its own
events, then no other packages can use those IDs for its own events
without a conflict.  The 8-bit ID space is divided into two parts:

0 - 63: Core event types (TIMER, MQUEUE_DATA, etc.)
64+: Per-task event types.

So, the options for the host package are:
1. Reserve new core event IDs.  This avoids conflicts, but permanently
   uses up a limited resource.
2. Use arbitrary per-task event IDs.  This has the potential for
   conflicts, and doesn't strike me as a particularly good solution.
3. Use a separate host task.  This allows the host use IDs in the per-task
   ID space without the risk of conflict.
4. Leverage existing core events.  This is what I proposed.  It avoids
   conflicts and doesn't require any new event IDs, but it does feel a
   bit hacky to use the TIMER event ID for something that isn't a timer.

I think this might be a common problem for other packages in the future.
I don't think it is that unusual for a package to not create its own
task, but still have the need to generate OS events.  So perhaps we
should think about how to solve this general problem.

Chris

Reply via email to