diff options
author | wrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68> | 2001-06-06 16:05:26 +0000 |
---|---|---|
committer | wrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68> | 2001-06-06 16:05:26 +0000 |
commit | 1f803c0151f1006bc872d9c06607928fd71c53a5 (patch) | |
tree | e2cf1112fcc2cf93079ee76cbd7f94b9622f8325 /network_io | |
parent | a8d2db45ab599607495f7f65e22c589fc632f4fc (diff) | |
download | libapr-1f803c0151f1006bc872d9c06607928fd71c53a5.tar.gz |
*) Complete the implementation of LARGEFILE support on Win32, although
the mmap semantics still need a touch of work.
*) Fix the APR_XTHREAD support, and apr_sendfile mechanics, so we can
handle cross-threaded file handles on Win32.
Sorry, it's rather hard to untangle one from the other to create two patches.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@61712 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'network_io')
-rw-r--r-- | network_io/win32/sendrecv.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/network_io/win32/sendrecv.c b/network_io/win32/sendrecv.c index 865dbca6b..da3ee6c75 100644 --- a/network_io/win32/sendrecv.c +++ b/network_io/win32/sendrecv.c @@ -258,12 +258,16 @@ APR_DECLARE(apr_status_t) apr_sendfile(apr_socket_t *sock, apr_file_t *file, /* Initialize the overlapped structure */ memset(&overlapped,'\0', sizeof(overlapped)); - if (offset && *offset) { - overlapped.Offset = *offset; - } + if (file->pOverlapped) + overlapped.hEvent = file->pOverlapped->hEvent; #ifdef WAIT_FOR_EVENT - overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + else + overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); #endif + if (offset && *offset) { + file->pOverlapped->Offset = (DWORD)*offset; + file->pOverlapped->OffsetHigh = (DWORD)(*offset >> 32); + } /* Handle the goofy case of sending headers/trailers and a zero byte file */ if (!bytes_to_send && hdtr) { @@ -320,15 +324,14 @@ APR_DECLARE(apr_status_t) apr_sendfile(apr_socket_t *sock, apr_file_t *file, if (!rv) { status = apr_get_netos_error(); if (status == APR_FROM_OS_ERROR(ERROR_IO_PENDING)) { -#ifdef WAIT_FOR_EVENT - rv = WaitForSingleObject(overlapped.hEvent, - (DWORD)(sock->timeout >= 0 - ? sock->timeout : INFINITE)); -#else - rv = WaitForSingleObject((HANDLE) sock->sock, - (DWORD)(sock->timeout >= 0 - ? sock->timeout : INFINITE)); -#endif + if (overlapped.hEvent) + rv = WaitForSingleObject(overlapped.hEvent, + (DWORD)(sock->timeout >= 0 + ? sock->timeout : INFINITE)); + else + rv = WaitForSingleObject((HANDLE) sock->sock, + (DWORD)(sock->timeout >= 0 + ? sock->timeout : INFINITE)); if (rv == WAIT_OBJECT_0) status = APR_SUCCESS; else if (rv == WAIT_TIMEOUT) @@ -376,7 +379,8 @@ APR_DECLARE(apr_status_t) apr_sendfile(apr_socket_t *sock, apr_file_t *file, } #ifdef WAIT_FOR_EVENT - CloseHandle(overlapped.hEvent); + if (!file->pOverlapped || !file->pOverlapped->hEvent) + CloseHandle(overlapped.hEvent); #endif return status; } |