hi,

On 4/4/16 11:59 AM, marko kiiskila wrote:

On Apr 4, 2016, at 11:33 AM, Sterling Hughes <[email protected]> wrote:

I don’t think the select() kind of mask is a good idea. eventq_XXX is more
like kqueue() rather than select(). I don’t think there are that many places
where you’d want to mask out some events and not others. Especially
as this’ll mean that there will presumably will mean that events will get
delivered out of order.


Would you prefer that eventq_poll() poll multiple eventq and return when an 
event is available on one of them, or there is a timeout?   I can understand 
wanting to preserve ordering on the queue, and things getting confusing if app 
code isn't smart about this.

However, I think it is a fairly common access mechanism to want to grab only 
certain events from a queue.  Imagine a case where you send a packet, and you 
are waiting for a response, and you only want to pull events related to 
response from the eventq, even if you have multiple events that can run through 
that queue.  I see two options for handling this neatly:

1- Have a mask, and only pull events off that queue which match the mask
2- Have eventq_poll() take multiple event queues, so that you can poll multiple 
queues at once.

What do you think?


Converting an array of integers to bit mask in the caller, and doing the reverse
in the callee is not too great.

Option 2 sounds much, much better.


OK, cool.

So, this is the API I'm thinking of:

struct os_event *
os_eventq_poll(struct os_eventq **evq, int n, os_time_t timo);

Where evq is an array of eventq to poll, and n is the number of elements in that array. timo represents the timeout in ticks, across all the eventqs.

This function returns NULL on no events within timo, or the first available event if not. timo can be OS_WAIT_FOREVER, if caller wishes to sleep until an event becomes available.

Sterling

Reply via email to