Hi Laurent !
> On 18/03/2015 18:08, Didier Kryn wrote:
No, you must write to the pipe to detect it is broken. And you won't
try to write before you've got an event from the netlink. This event
will be lost.
On 18.03.2015 18:41, Laurent Bercot wrote:
I skim over that discussion (because I don't agree with the design)
Why?
Did you note my last two alternatives, unexpectedly both named #3?
... but specifically the last one "Netlink the Unix way"?
- uses private pipe for netlink and named pipe for hotplug helper
(with maximum of code sharing)
- should most likely do the flow of operation as you suggested
(as far I did understand you)
- except, I split of the pipe watcher / on demand startup code of the
conf parser / device operation into it's own thread (process), for
general code usability as a different applet for on demand pipe consumer
startup purposes
(you had that function as integral part of your netlink reader)
- and I'm currently going to split of that one-shot "xdev init" feature
from the xdev, creating an own applet / command for this, as you suggested
(extending functionality for even more general usage, as suggested by
Isaac, independent from the device management, and maybe modifiable in
it's operation by changing functions in a shell script)
So why do you still doubt about the design? ... because I moved some
code into it's own (small) helper thread?
I can't make any substantial comments, but here's a nitpick: if you
use an asynchronous event loop, your selector triggers - POLLHUP for
poll(), not sure if it's writability or exception for select()- as
soon as a pipe is broken.
This is what I expected, but the problem is, the question for this
arrived, and I can't find the location where this is documented.
Note that events can still be lost, because the pipe can be broken
while you're reading a message from the netlink, before you come
back to the selector; so the message you just read cannot be sent.
But that is a risk you have to take everytime you perform buffered IO,
there's no way around it.
Ok, what would you then do? Unbuffered I/O on the pipe, and then what?
... if that single one more message dropped, except the others not read
from netlink buffer (to be lost on close), matters, then we shall indeed
use unbuffered I/O on the pipe, and only read a message, when there is
room for one more one more message in the pipe:
set non blocking I/O on stdout
establish netlink socket
loop:
poll for write on stdout possible, until available
(may set an upper timeout limit, failure on timeout)
poll for netlink read and still for write on stdout
if write ability drops
we are in serious trouble, failure
if netlink read possible
gather message from netlink
write message to stdout (should never block)
on EAGAIN, EINTR: do 3 write retries, then failure
... does that fit better? I don't think that it makes a big difference,
but I can live with the slight bigger code.
My problem is not the detection of the failing pipe write, but the
reaction on it. When that happen, the down chain of the pipe most likely
need more than just a restart. That is, it should only happen on serious
failure in the conf file or the device operations (-> manual action
required). So I expect more loss of event messages, than just that
single one message, you were grumbling about. Hence on hotplug restart
we need to re-trigger the plug events, nevertheless!
--
Harald
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox