You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/09/30 18:03:16 UTC

svn commit: r820327 - in /commons/sandbox/runtime/trunk/src/main/native: include/acr_file.h include/arch/windows/acr_arch.h os/unix/fsysio.c os/win32/fsysio.c

Author: mturk
Date: Wed Sep 30 16:03:15 2009
New Revision: 820327

URL: http://svn.apache.org/viewvc?rev=820327&view=rev
Log:
Implement more read methods

Modified:
    commons/sandbox/runtime/trunk/src/main/native/include/acr_file.h
    commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h
    commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_file.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_file.h?rev=820327&r1=820326&r2=820327&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_file.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_file.h Wed Sep 30 16:03:15 2009
@@ -184,6 +184,7 @@
     int          err;                   /**< Last error value           */
     acr_uint32_t flags;                 /**< File flags                 */
     acr_time_t   timeout;               /**< I/O timeout                */
+    acr_off_t    pos;                   /**< Current file pointer       */
     enum {
         BLK_UNKNOWN,
         BLK_OFF,
@@ -193,9 +194,9 @@
     /* The rest of the structure is platform specific.
      */
 #if defined(WIN32)
-    LARGE_INTEGER   pos;
+    CRITICAL_SECTION lock;
 #else
-    acr_off_t       pos;
+    pthread_mutex_t  lock;
 #endif
 
 } acr_file_t;

Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h?rev=820327&r1=820326&r2=820327&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h Wed Sep 30 16:03:15 2009
@@ -642,6 +642,28 @@
 #undef  IsWow64Process
 #define IsWow64Process acr_winapi_IsWow64Process
 
+ACR_DECLARE_LATE_DLL_FUNC(SYSDLL_KERNEL32, BOOL, FALSE,
+                          WINAPI, GetPerformanceInfo, 0, (
+    PPERFORMACE_INFORMATION pPerformanceInformation,
+    DWORD cb),
+    (pPerformanceInformation, cb));
+#undef  GetPerformanceInfo
+#define GetPerformanceInfo acr_winapi_GetPerformanceInfo
+
+#if !defined(FILE_NAME_NORMALIZED)
+#define FILE_NAME_NORMALIZED 0
+#endif
+ACR_DECLARE_LATE_DLL_FUNC(SYSDLL_KERNEL32, DWORD, 0,
+                          WINAPI, GetFinalPathNameByHandleW, 0, (
+  IN  HANDLE hFile,
+  OUT LPWSTR lpszFilePath,
+  IN  DWORD  cchFilePath,
+  IN  DWORD  dwFlags),
+    (hFile, lpszFilePath, cchFilePath, dwFlags));
+#undef  GetFinalPathNameByHandleW
+#define GetFinalPathNameByHandleW acr_winapi_GetFinalPathNameByHandleW
+
+
 ACR_DECLARE_LATE_DLL_FUNC(SYSDLL_NTDLL, NTSTATUS, 1,
                           WINAPI, NtQuerySystemInformation, 0, (
     IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
@@ -663,14 +685,6 @@
 #undef  NtQueryInformationProcess
 #define NtQueryInformationProcess acr_winapi_NtQueryInformationProcess
 
-ACR_DECLARE_LATE_DLL_FUNC(SYSDLL_KERNEL32, BOOL, FALSE,
-                          WINAPI, GetPerformanceInfo, 0, (
-    PPERFORMACE_INFORMATION pPerformanceInformation,
-    DWORD cb),
-    (pPerformanceInformation, cb));
-#undef  GetPerformanceInfo
-#define GetPerformanceInfo acr_winapi_GetPerformanceInfo
-
 ACR_DECLARE_LATE_DLL_FUNC(SYSDLL_IPHLPAPI, DWORD, ERROR_INVALID_FUNCTION,
                           WINAPI, GetExtendedTcpTable, 0, (
     PVOID pTcpTable,

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c?rev=820327&r1=820326&r2=820327&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c Wed Sep 30 16:03:15 2009
@@ -108,6 +108,9 @@
     if ((flags & ACR_FOPEN_EXCL) && !(flags & ACR_FOPEN_CREATE)) {
         return ACR_EINVAL;
     }
+    if ((flags & ACR_FOPEN_APPEND) && !(flags & ACR_FOPEN_WRITE)) {
+        return ACR_EINVAL;
+    }
     if (flags & ACR_FOPEN_APPEND)
         oflags |= O_APPEND;
     if (flags & ACR_FOPEN_TRUNCATE)

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c?rev=820327&r1=820326&r2=820327&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c Wed Sep 30 16:03:15 2009
@@ -121,6 +121,9 @@
     if ((flags & ACR_FOPEN_EXCL) && !(flags & ACR_FOPEN_CREATE)) {
         return ACR_EINVAL;
     }
+    if ((flags & ACR_FOPEN_APPEND) && !(flags & ACR_FOPEN_WRITE)) {
+        return ACR_EINVAL;
+    }
     if (flags & ACR_FOPEN_DELONCLOSE)
         aflags |= FILE_FLAG_DELETE_ON_CLOSE;
     if (flags & ACR_FOPEN_SENDFILE_ENABLED) {
@@ -166,7 +169,6 @@
         goto finally;
     }
     fp->fd    = fh;
-    fp->name  = ACR_StrdupW(_E, THROW_NMARK, fname);
     fp->flags = flags;
     fp->type  = ACR_FT_REG; /* Presume it's a regular file */
     if (flags & ACR_FOPEN_NONBLOCK)
@@ -181,6 +183,49 @@
         rc = ACR_GET_OS_ERROR();
         goto finally;
     }
+    if (ACR_HAVE_LATE_DLL_FUNC(GetFinalPathNameByHandleW)) {
+        DWORD nl;
+        nl = GetFinalPathNameByHandleW(fh, NULL, 0, FILE_NAME_NORMALIZED);
+        if (nl == 0) {
+            rc = ACR_GET_OS_ERROR();
+            goto finally;
+        }
+        fp->name = ACR_MALLOC(wchar_t, nl + 1);
+        if (!fp->name) {
+            rc = ACR_ENOMEM;
+            goto finally;
+        }
+        GetFinalPathNameByHandleW(fh, fp->name, nl, FILE_NAME_NORMALIZED);
+    }
+    else {
+        DWORD nl;
+
+        nl = GetFullPathNameW(fname, 0, NULL, NULL);
+        if (nl == 0) {
+            rc = ACR_GET_OS_ERROR();
+            goto finally;
+        }
+        fp->name = ACR_MALLOC(wchar_t, nl + 1);
+        if (!fp->name) {
+            rc = ACR_ENOMEM;
+            goto finally;
+        }
+        GetFullPathNameW(fname, nl, fp->name, NULL);
+    }
+    if (flags & ACR_FOPEN_APPEND) {
+        __try {
+            /* On Vista+ exception is no longer thrown
+             */
+            InitializeCriticalSection(&fp->lock);
+        }
+        __except(EXCEPTION_EXECUTE_HANDLER) {
+            rc = ACR_ENOMEM;
+            goto finally;
+        }
+        /* Position to the file end
+         */
+        SetFilePointer(fh, 0, NULL, FILE_END);
+    }
     /* Create File Descriptor Object */
     *fdo = ACR_DescriptorCreate(_E, ACR_DT_FILE, fo, NULL,
                                 descriptor_cleanup);
@@ -188,11 +233,7 @@
         rc = ACR_GET_OS_ERROR();
         goto finally;
     }
-    if (flags & ACR_FOPEN_APPEND) {
-        /* Position to the file end
-         */
-        SetFilePointer(fh, 0, NULL, FILE_END);
-    }
+
 finally:
     if (rc) {
         if (IS_VALID_HANDLE(fh))
@@ -457,7 +498,8 @@
         ACR_THROW_IO_ERRNO();
         return -1;
     }
-    return (jlong)op.QuadPart;
+    f->pos = op.QuadPart;
+    return (jlong)f->pos;
 }
 
 ACR_IO_EXPORT_DECLARE(jint, FileSystem, trunc0)(ACR_JNISTDARGS,
@@ -475,6 +517,8 @@
     os.QuadPart = off;
     if (!SetFilePointerEx(f->fd, os, NULL, FILE_BEGIN))
         return ACR_GET_OS_ERROR();
+    else
+        f->pos = off;
     if (!SetEndOfFile(f->fd))
         return ACR_GET_OS_ERROR();
     else
@@ -613,7 +657,7 @@
     }
 
     if (f->blocking == BLK_OFF) {
-        if (f->timeout == 0 && f->type == ACR_DT_PIPE) {
+        if (f->timeout == 0 && f->type == ACR_FT_PIPE) {
             if (!PeekNamedPipe(f->fd, NULL, 0, NULL, &rd, NULL)) {
                 rc = GetLastError();
                 if (rc == ERROR_BROKEN_PIPE) {
@@ -637,15 +681,15 @@
             lpo->hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
         if (IS_INVALID_HANDLE(lpo->hEvent))
             return ACR_GET_OS_ERROR();
-        lpo->Offset     = f->pos.LowPart;
-        lpo->OffsetHigh = f->pos.HighPart;
+        lpo->Offset     = (DWORD)(f->pos);
+        lpo->OffsetHigh = (DWORD)(f->pos >> 32);
     }
     f->err = 0;
     if (ReadFile(f->fd, &c, 1, &rd, lpo)) {
         /* All done. Update the position and return
          */
         if (rd) {
-            f->pos.QuadPart += rd;
+            f->pos += rd;
             return c;
         }
         else {
@@ -664,7 +708,7 @@
                 case 0:
                     f->err = 0;
                     if (rd) {
-                        f->pos.QuadPart += rd;
+                        f->pos += rd;
                         return c;
                     }
                     else
@@ -722,7 +766,7 @@
         return -1;
     }
     if (f->blocking == BLK_OFF) {
-        if (f->timeout == 0 && f->type == ACR_DT_PIPE) {
+        if (f->timeout == 0 && f->type == ACR_FT_PIPE) {
             if (!PeekNamedPipe(f->fd, NULL, 0, NULL, &rd, NULL)) {
                 rc = GetLastError();
                 if (rc == ERROR_BROKEN_PIPE) {
@@ -755,8 +799,8 @@
             ACR_THROW_IO_ERRNO();
             return -1;
         }
-        lpo->Offset     = f->pos.LowPart;
-        lpo->OffsetHigh = f->pos.HighPart;
+        lpo->Offset     = (DWORD)(f->pos);
+        lpo->OffsetHigh = (DWORD)(f->pos >> 32);
     }
     if (cs > (DWORD)sizeof(onstack)) {
         if (cs > (1024 * 1024)) {
@@ -778,7 +822,7 @@
         /* All done. Update the position and return
          */
         if (rd)
-            f->pos.QuadPart += rd;
+            f->pos += rd;
         else
             f->eof = 1;
         goto finally;
@@ -794,7 +838,7 @@
                 case 0:
                     f->err = 0;
                     if (rd) {
-                        f->pos.QuadPart += rd;
+                        f->pos += rd;
                         goto finally;
                     }
                     else
@@ -840,3 +884,256 @@
     }
     return (jint)rd;
 }
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystem, read2)(ACR_JNISTDARGS,
+                                               jint file,
+                                               jobject ptr,
+                                               jlong off,
+                                               jlong len)
+{
+    size_t  pl;
+    DWORD   po = (DWORD)off;
+    DWORD   cs = (DWORD)len;
+    DWORD   rd = 0;
+    DWORD   rc;
+    LPOVERLAPPED lpo = NULL;
+    jbyte  *pb;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_IO_IF_ERR(ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_IO_IF_ERR(ACR_EBADF);
+        return -1;
+    }
+    if (f->eof) {
+        return -1;
+    }
+    if (f->blocking == BLK_OFF) {
+        if (f->timeout == 0 && f->type == ACR_FT_PIPE) {
+            if (!PeekNamedPipe(f->fd, NULL, 0, NULL, &rd, NULL)) {
+                rc = GetLastError();
+                if (rc == ERROR_BROKEN_PIPE) {
+                    f->eof = 1;
+                    return -1;
+                }
+                else {
+                    ACR_THROW_IO_IF_ERR(rc);
+                    return -1;
+                }
+            }
+            else {
+                if (rd == 0) {
+                    f->err = ACR_TIMEUP;
+                    return 0;
+                }
+                else {
+                    /* Update read size that can be done
+                     * without blocking
+                     */
+                    if (cs > rd)
+                        cs = rd;
+                }
+            }
+        }
+        lpo = &f->overlap;
+        if (IS_INVALID_HANDLE(lpo->hEvent))
+            lpo->hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
+        if (IS_INVALID_HANDLE(lpo->hEvent)) {
+            ACR_THROW_IO_ERRNO();
+            return -1;
+        }
+        lpo->Offset     = (DWORD)(f->pos);
+        lpo->OffsetHigh = (DWORD)(f->pos >> 32);
+    }
+    pb = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
+    if (!pb) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return -1;
+    }
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+    f->err = 0;
+    if (ReadFile(f->fd, pb + po, cs, &rd, lpo)) {
+        /* All done. Update the position and return
+         */
+        if (rd)
+            f->pos += rd;
+        else
+            f->eof = 1;
+        goto finally;
+    }
+    switch (f->err = GetLastError()) {
+        case ERROR_HANDLE_EOF:
+        case ERROR_BROKEN_PIPE:
+            f->err = 0;
+            f->eof = 1;
+        break;
+        case ERROR_IO_PENDING:
+            switch (rc = overlapped_wait(f, &rd)) {
+                case 0:
+                    f->err = 0;
+                    if (rd) {
+                        f->pos += rd;
+                        goto finally;
+                    }
+                    else
+                        f->eof = 1;
+                break;
+                case ERROR_HANDLE_EOF:
+                case ERROR_BROKEN_PIPE:
+                    f->err = 0;
+                    f->eof = 1;
+                break;
+                case ACR_TIMEUP:
+                    f->err = ACR_TIMEUP;
+                break;
+                default:
+                    f->err = rc;
+                break;
+            }
+        break;
+        default:
+        break;
+    }
+
+finally:
+    if (rd)
+        return (jint)rd;
+    if (f->err)
+        return f->err == ACR_TIMEUP ? 0 : -1;
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystem, read3)(ACR_JNISTDARGS,
+                                               jint file,
+                                               jobject dbb,
+                                               jlong off,
+                                               jlong len)
+{
+#if defined(_DEBUG)
+    DWORD   pl;
+#endif
+    DWORD   po = (DWORD)off;
+    DWORD   cs = (DWORD)len;
+    DWORD   rd = 0;
+    DWORD   rc;
+    LPOVERLAPPED lpo = NULL;
+    jbyte  *pb;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_IO_IF_ERR(ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_IO_IF_ERR(ACR_EBADF);
+        return -1;
+    }
+    if (f->eof) {
+        return -1;
+    }
+    if (f->blocking == BLK_OFF) {
+        if (f->timeout == 0 && f->type == ACR_FT_PIPE) {
+            if (!PeekNamedPipe(f->fd, NULL, 0, NULL, &rd, NULL)) {
+                rc = GetLastError();
+                if (rc == ERROR_BROKEN_PIPE) {
+                    f->eof = 1;
+                    return -1;
+                }
+                else {
+                    ACR_THROW_IO_IF_ERR(rc);
+                    return -1;
+                }
+            }
+            else {
+                if (rd == 0) {
+                    f->err = ACR_TIMEUP;
+                    return 0;
+                }
+                else {
+                    /* Update read size that can be done
+                     * without blocking
+                     */
+                    if (cs > rd)
+                        cs = rd;
+                }
+            }
+        }
+        lpo = &f->overlap;
+        if (IS_INVALID_HANDLE(lpo->hEvent))
+            lpo->hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
+        if (IS_INVALID_HANDLE(lpo->hEvent)) {
+            ACR_THROW_IO_ERRNO();
+            return -1;
+        }
+        lpo->Offset     = (DWORD)(f->pos);
+        lpo->OffsetHigh = (DWORD)(f->pos >> 32);
+    }
+    pb = (jbyte *)(*_E)->GetDirectBufferAddress(_E, dbb);
+    if (!pb) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return -1;
+    }
+#if defined(_DEBUG)
+    pl = (DWORD)(*_E)->GetDirectBufferCapacity(_E, dbb);
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+#endif
+    f->err = 0;
+    if (ReadFile(f->fd, pb + po, cs, &rd, lpo)) {
+        /* All done. Update the position and return
+         */
+        if (rd)
+            f->pos += rd;
+        else
+            f->eof = 1;
+        goto finally;
+    }
+    switch (f->err = GetLastError()) {
+        case ERROR_HANDLE_EOF:
+        case ERROR_BROKEN_PIPE:
+            f->err = 0;
+            f->eof = 1;
+        break;
+        case ERROR_IO_PENDING:
+            switch (rc = overlapped_wait(f, &rd)) {
+                case 0:
+                    f->err = 0;
+                    if (rd) {
+                        f->pos += rd;
+                        goto finally;
+                    }
+                    else
+                        f->eof = 1;
+                break;
+                case ERROR_HANDLE_EOF:
+                case ERROR_BROKEN_PIPE:
+                    f->err = 0;
+                    f->eof = 1;
+                break;
+                case ACR_TIMEUP:
+                    f->err = ACR_TIMEUP;
+                break;
+                default:
+                    f->err = rc;
+                break;
+            }
+        break;
+        default:
+        break;
+    }
+
+finally:
+    if (rd)
+        return (jint)rd;
+    if (f->err)
+        return f->err == ACR_TIMEUP ? 0 : -1;
+    return -1;
+}