Return-Path: Delivered-To: apache-cvs-archive@hyperreal.org Received: (qmail 11487 invoked by uid 6000); 8 Mar 1998 04:12:39 -0000 Received: (qmail 11481 invoked by alias); 8 Mar 1998 04:12:38 -0000 Delivered-To: apache-2.0-cvs@hyperreal.org Received: (qmail 11477 invoked by uid 149); 8 Mar 1998 04:12:37 -0000 Date: 8 Mar 1998 04:12:37 -0000 Message-ID: <19980308041237.11476.qmail@hyperreal.org> From: marc@hyperreal.org To: apache-2.0-cvs@hyperreal.org Subject: cvs commit: apache-2.0/docs page_io Sender: apache-cvs-owner@apache.org Precedence: bulk Reply-To: new-httpd@apache.org marc 98/03/07 20:12:37 Modified: docs page_io Log: A few more comments. They don't entirely belong in page_io, but they are on related topics so they can live there for now. Revision Changes Path 1.4 +54 -0 apache-2.0/docs/page_io Index: page_io =================================================================== RCS file: /export/home/cvs/apache-2.0/docs/page_io,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- page_io 1998/03/08 03:21:00 1.3 +++ page_io 1998/03/08 04:12:37 1.4 @@ -73,6 +73,10 @@ For details on HPUX and avoiding extra data copies, see . +(note that if you get the postscript version instead, you have to +manually edit it to remove the front page before any version of +ghostscript that I have used will read it) + ---- I've been told by an engineer in Sun's TCP/IP group that zero-copy TCP @@ -85,3 +89,53 @@ We currently get the 16k stuff for free by using mmap(). But sun's current code isn't smart enough to deal with our initial writev() of the headers and first part of the response. + +---- + +Systems that have a system call to efficiently send the contents of a +descriptor across the network. This is probably the single best way +to do static content on systems that support it. + +HPUX: + + ssize_t sendfile(int s, int fd, off_t offset, size_t nbytes, + const struct iovec *hdtrl, int flags); + + (allows you to add headers and trailers in the form of iovec + structs) + +Windows NT: + + BOOL TransmitFile( SOCKET hSocket, + HANDLE hFile, + DWORD nNumberOfBytesToWrite, + DWORD nNumberOfBytesPerSend, + LPOVERLAPPED lpOverlapped, + LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, + DWORD dwFlags + ); + + (does it start from the current position in the handle? I would + hope so, or else it is pretty dumb.) + + lpTransmitBuffers allows for headers and trailers. + + Documentation at: + + http://premium.microsoft.com/msdn/library/sdkdoc/wsapiref_3pwy.htm + http://premium.microsoft.com/msdn/library/conf/html/sa8ff.htm + + Even less related to page based IO: just context switching: + AcceptEx does an accept(), and returns the start of the + input data. see: + + http://premium.microsoft.com/msdn/library/sdkdoc/pdnds/sock2/wsapiref_17jm.htm + + What this means is you require one less syscall to do a + typical request, especially if you have a cache of handles + so you don't have to do an open or close. Hmm. Interesting + question: then, if TransmitFile starts from the current + position, you need a mutex around the seek and the + TransmitFile. If not, you are just limited (eg. byte + ranges) in what you can use it for. +