Messages in this thread | | | Date | Sun, 12 Aug 2007 22:56:14 +0200 | From | David Härdeman <> | Subject | Re: splice question |
| |
On Sun, Aug 12, 2007 at 12:41:54PM -0700, Linus Torvalds wrote: >On Sun, 12 Aug 2007, David H?rdeman wrote: >> Otherwise I guess I'd have to add a second pipe, then (in a loop) >> tee() from the first to the second pipe and then splice from the second pipe >> to a socket. Doesn't sound very elegant and would need quite a lot of extra >> syscalls. > >You really should think of this as a memcpy(), and you'll be in the right >mindframe. The system calls themselves are cheap.
Ok, I've implemented it using two pipes, and it works. But it does seem a bit wasteful...in case one client is not keeping up, the data will have to be tee():ed first from pipe1 to pipe2, only to then find out that the splice() from pipe2 to socket only does a partial transfer after which the data in pipe2 has to be thrown away and then the loop starts over with the next client.
A tee() from pipe1 to the socket could (I imagine) realize immediately that the socket does not have enough buffer space and return EWOULDBLOCK and avoid at least one copy?
-- David Härdeman - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |