summaryrefslogtreecommitdiff
path: root/network_io
diff options
context:
space:
mode:
authorwrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68>2001-06-06 16:05:26 +0000
committerwrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68>2001-06-06 16:05:26 +0000
commit1f803c0151f1006bc872d9c06607928fd71c53a5 (patch)
treee2cf1112fcc2cf93079ee76cbd7f94b9622f8325 /network_io
parenta8d2db45ab599607495f7f65e22c589fc632f4fc (diff)
downloadlibapr-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.c32
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;
}