Re: kqueue disable on delivery...



On Sun, 17 Sep 2006, John-Mark Gurney wrote:

I have implemented a couple additional features to kqueue. These allow
kqueue to be a multithreaded event delivery system that can guarantee
that the event will only be active in one thread at any time.

The first is EV_DOD, aka disable on delivery. When the event will be
delivered to userland, the knote is marked disabled so we don't
have to go through the expense of reallocing the knote each time.
(Reallocation of the knote is also lock intensive, and disabling is
cheap.)

In my opinion, it's too implementation specific flag.

Even though this means that the event will only ever be active in a
thread at a time, (when you're done handling the event, you reenable
it), removing the event from the queue outside the event handler (say
a timeout handler for the connection) poses to be a problem. If you
simply close the socket, the event disappears, but then there is a
race between another event being created with the same socket, and
notification of the handler that you want the event to stop.

In order to handle that situation, I have come up w/ EV_FORCEOS, aka
FORCE ONE_SHOT. EV_ONESHOT events have the advantage that once queued,
they don't care if they have been activated or not, they will be returned
the next round. This means that the timeout handler can safely set
EV_FORCEOS on the handler, and either if it's _DISABLED (handler running
and will reenable it), or it's _ENABLED, it will get dispatched, allowing
the handler to detect the EV_FORCEOS flag and teardown the connection.

I think it should be EVFILT_USER event, allowing to
EV_SET(&kev, fd, EVFILT_USER, 0, 0, 0, udata);
and the event should automatically sets the EV_ONESHOT flag internally.


Igor Sysoev
http://sysoev.ru/en/
_______________________________________________
freebsd-arch@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-arch
To unsubscribe, send any mail to "freebsd-arch-unsubscribe@xxxxxxxxxxx"



Relevant Pages