Author: mturk
Date: Thu Aug 11 11:58:24 2011
New Revision: 1156582

URL: http://svn.apache.org/viewvc?rev=1156582&view=rev
Log:
Do not alloc separate overlapped struct

Modified:
    commons/sandbox/runtime/trunk/src/main/native/include/acr/descriptor.h
    commons/sandbox/runtime/trunk/src/main/native/os/win32/sendfile.c
    
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestLocalEndpoint.java

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr/descriptor.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr/descriptor.h?rev=1156582&r1=1156581&r2=1156582&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr/descriptor.h 
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr/descriptor.h Thu 
Aug 11 11:58:24 2011
@@ -98,7 +98,7 @@ struct acr_sf_t {
 #else
     acr_off_t     off;
     acr_off_t     size;
-    LPOVERLAPPED  pob;        /**< For TransmitFile       */
+    OVERLAPPED    ob;
 #endif
 };
 

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/sendfile.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/sendfile.c?rev=1156582&r1=1156581&r2=1156582&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/sendfile.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/sendfile.c Thu Aug 
11 11:58:24 2011
@@ -27,7 +27,7 @@
 #include "arch_opts.h"
 #include "arch_sync.h"
 
-ACR_NET_EXPORT(jlong, SendFile, open0)(JNI_STDARGS, jstring fname)
+ACR_NET_EXPORT(jlong, Sendfile, open0)(JNI_STDARGS, jstring fname)
 {
     int       rc = 0;
     acr_sf_t *sf;
@@ -58,26 +58,17 @@ ACR_NET_EXPORT(jlong, SendFile, open0)(J
         ACR_THROW_NET_ERROR(rc);
         return 0;
     }
-    sf->pob = ACR_TALLOC(OVERLAPPED);
-    if (sf->pob != 0) {
-        sf->pob->hEvent = CreateEvent(0, FALSE, FALSE, 0);
-        return P2J(sf);
-    }
-    else {
-        CloseHandle(sf->fh);
-        AcrFree(sf);
-        return 0;
-    }
+    sf->ob.hEvent = CreateEvent(0, FALSE, FALSE, 0);
+    return P2J(sf);
 }
 
-ACR_NET_EXPORT(jint, SendFile, close0)(JNI_STDARGS, jlong fp)
+ACR_NET_EXPORT(jint, Senfile, close0)(JNI_STDARGS, jlong fp)
 {
     int       rc = 0;
     acr_sf_t *sf = J2P(fp, acr_sf_t *);
 
     CloseHandle(sf->fh);
-    CloseHandle(sf->pob->hEvent);
-    AcrFree(sf->pob);
+    CloseHandle(sf->ob.hEvent);
     AcrFree(sf);
     return rc;
 }
@@ -132,30 +123,30 @@ ACR_NET_EXPORT(jint, Sendfile, send0)(JN
         AcrSdRelease(sd);
         return -1;
     }
-    sf->pob->Offset     = (DWORD)(sf->off);
-    sf->pob->OffsetHigh = (DWORD)(sf->off >> 32);
+    sf->ob.Offset     = (DWORD)(sf->off);
+    sf->ob.OffsetHigh = (DWORD)(sf->off >> 32);
     while (tosend > 0) {
         if (tosend > MAX_SEGMENT_SIZE)
             cnt = MAX_SEGMENT_SIZE;
         else
-            cnt = (DWORD)tosend; /* Last call to TransmitFile() */
-        /* XXX: MSDN says that it should be obtained by WSAIoctl
-         *      but it seems this works just fine as it is.
+            cnt = (DWORD)tosend;
+        /* XXX: MSDN says that TransmitFile should be obtained via WSAIoctl,
+         *      but it seems this works just fine without it.
          */
         if (!(*winsock->TransmitFile)(sock, /* socket */
                             sf->fh,         /* file descriptor of the file to 
be sent */
                             cnt,            /* number of bytes to send. 0=send 
all */
                             0,              /* Number of bytes per send. 0=use 
default */
-                            sf->pob,        /* OVERLAPPED structure */
+                            &sf->ob,        /* OVERLAPPED structure */
                             0,              /* header and trailer buffers */
                             dwFlags)) {     /* flags to control various 
aspects of TransmitFile */
             rc = WSAGetLastError();
             if (rc == ERROR_IO_PENDING || rc == WSA_IO_PENDING) {
-                DWORD ws = WaitForSingleObject(sf->pob->hEvent, sd->timeout);
+                DWORD ws = WaitForSingleObject(sf->ob.hEvent, sd->timeout);
                 if (ws == WAIT_OBJECT_0) {
                     rc = 0;
                     if (!WSAGetOverlappedResult(sock,
-                                                sf->pob->hEvent,
+                                                &sf->ob,
                                                 &cnt,
                                                 FALSE,
                                                 &dwFlags))
@@ -174,7 +165,7 @@ ACR_NET_EXPORT(jint, Sendfile, send0)(JN
         xmitted += cnt;
     }
 finally:
-    if (rc != 0) {
+    if (rc != 0 && xmitted == 0) {
         xmitted = -1;
         ACR_THROW_NET_ERROR(rc);
     }

Modified: 
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestLocalEndpoint.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestLocalEndpoint.java?rev=1156582&r1=1156581&r2=1156582&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestLocalEndpoint.java
 (original)
+++ 
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestLocalEndpoint.java
 Thu Aug 11 11:58:24 2011
@@ -21,6 +21,7 @@ import java.io.FileDescriptor;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.List;
+import org.apache.commons.runtime.io.Stream;
 import org.testng.annotations.*;
 import org.testng.Assert;
 
@@ -85,6 +86,9 @@ public class TestLocalEndpoint extends A
                     // Another select with zero timeout
                     set = ps.select(0);
                     assertEquals(set.size(), 0);
+                    e.configureBlocking(true);
+                    Stream s = e.getStream();
+                    s.read();
                 } catch (Exception x) {
                     fail("Accept failed " + x.toString());
                     break;


Reply via email to