Ignore:
Timestamp:
May 31, 2012, 5:49:53 PM (13 years ago)
Author:
dmik
Message:

icedtea-web: Make java.io.FileDescriptor work with LIBC file descriptors.

On Windows, this class carries both the windows handle and the libc file
descriptor but only handles were used so far. Now, if the handle is not set,
the descriptor will be used (with a relevant LIBC call).

Location:
trunk/openjdk/jdk/src/windows/native/java/io
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/openjdk/jdk/src/windows/native/java/io/FileDescriptor_md.c

    r278 r373  
    5555JNIEXPORT jlong JNICALL
    5656Java_java_io_FileDescriptor_set(JNIEnv *env, jclass fdClass, jint fd) {
    57     SET_HANDLE(fd);
     57    RETURN_HANDLE(fd);
    5858}
    5959
  • trunk/openjdk/jdk/src/windows/native/java/io/FileOutputStream_md.c

    r278 r373  
    7171    jboolean append = (*env)->GetBooleanField(env, this, fos_append);
    7272    FD fd = GET_FD(this, fos_fd);
    73     if (fd == -1) {
     73    if (!VALID_FD(fd)) {
    7474        JNU_ThrowIOException(env, "Stream Closed");
    7575        return;
     
    8888    jboolean append = (*env)->GetBooleanField(env, this, fos_append);
    8989    FD fd = GET_FD(this, fos_fd);
    90     if (fd == -1) {
     90    if (!VALID_FD(fd)) {
    9191        JNU_ThrowIOException(env, "Stream Closed");
    9292        return;
  • trunk/openjdk/jdk/src/windows/native/java/io/io_util_md.c

    r330 r373  
    533533{
    534534    FD fd = GET_FD(this, fid);
    535     HANDLE h = (HANDLE)fd;
     535    HANDLE h = (HANDLE)fd.handle;
    536536
    537537    if (h == INVALID_HANDLE_VALUE) {
     
    548548
    549549    if (CloseHandle(h) == 0) { /* Returns zero on failure */
    550         SET_FD(this, fd, fid); // restore fd
     550        SET_FD(this, fd.handle, fid); // restore fd
    551551        JNU_ThrowIOExceptionWithLastError(env, "close failed");
    552552    }
  • trunk/openjdk/jdk/src/windows/native/java/io/io_util_md.h

    r278 r373  
    5454 * Macros to use the right data type for file descriptors
    5555 */
    56 #define FD jlong
     56typedef struct __FD
     57{
     58    jint fd;
     59    jlong handle;
     60} _FD;
     61
     62#define FD _FD
    5763
    5864/*
     
    6167 * will simply return -1 to avoid crashing VM.
    6268 */
     69
    6370#define SET_FD(this, fd, fid) \
    6471    if ((*env)->GetObjectField(env, (this), (fid)) != NULL) \
     
    6673
    6774#define GET_FD(this, fid) \
    68     ((*env)->GetObjectField(env, (this), (fid)) == NULL) ? \
    69       -1 : (*env)->GetLongField(env, (*env)->GetObjectField(env, (this), (fid)), IO_handle_fdID)
     75    { ((*env)->GetObjectField(env, (this), (fid)) == NULL ? \
     76      -1 : (*env)->GetIntField(env, (*env)->GetObjectField(env, (this), (fid)), IO_fd_fdID)), \
     77      ((*env)->GetObjectField(env, (this), (fid)) == NULL ? \
     78        -1 : (*env)->GetLongField(env, (*env)->GetObjectField(env, (this), (fid)), IO_handle_fdID)) }
     79
     80#define ASSIGN_FD(fd, this, fid) \
     81    do { \
     82        fd.fd = ((*env)->GetObjectField(env, (this), (fid)) == NULL ? \
     83            -1 : (*env)->GetIntField(env, (*env)->GetObjectField(env, (this), (fid)), IO_fd_fdID)); \
     84        fd.handle = ((*env)->GetObjectField(env, (this), (fid)) == NULL ? \
     85            -1 : (*env)->GetLongField(env, (*env)->GetObjectField(env, (this), (fid)), IO_handle_fdID)); \
     86    } while(0)
     87
     88#define VALID_FD(fd) (fd.handle != -1 || fd.fd != -1)
    7089
    7190/*
    7291 * Macros to set/get fd when inside java.io.FileDescriptor
    7392 */
    74 #define THIS_FD(obj) (*env)->GetLongField(env, obj, IO_handle_fdID)
     93#define THIS_FD(obj) { (*env)->GetLongField(env, obj, IO_fd_fdID), (*env)->GetLongField(env, obj, IO_handle_fdID) }
    7594
    7695/*
    7796 * Route the routines away from HPI layer
    7897 */
    79 #define IO_Write handleWrite
    80 #define IO_Sync handleSync
    81 #define IO_Read handleRead
    82 #define IO_Lseek handleLseek
    83 #define IO_Available handleAvailable
    84 #define IO_SetLength handleSetLength
     98#define IO_Write(fd,buf,len) (fd.handle != -1 ? handleWrite(fd.handle, buf, len) : JVM_Write(fd.fd, buf, len))
     99#define IO_Sync(fd) (fd.handle != -1 ? handleSync(fd.handle) : JVM_Sync(fd.fd))
     100#define IO_Read(fd,buf,len) (fd.handle != -1 ? handleRead(fd.handle, buf, len) : JVM_Read(fd.fd, buf, len))
     101#define IO_Lseek(fd,offset,whence) (fd.handle != -1 ? handleLseek(fd.handle, offset, whence) : JVM_Lseek(fd.fd, offset, whence))
     102#define IO_Available(fd,pbytes) (fd.handle != -1 ? handleAvailable(fd.handle, pbytes) : JVM_Available(fd.fd, pbytes))
     103#define IO_SetLength(fd, length) (fd.handle != -1 ? handleSetLength(fd.handle, length) : JVM_SetLength(fd.fd, length))
    85104
    86105/*
     
    88107 * standard handles stdIn, stdOut, stdErr
    89108 */
    90 #define SET_HANDLE(fd) \
     109#define RETURN_HANDLE(fd) \
    91110if (fd == 0) { \
    92111    return (jlong)GetStdHandle(STD_INPUT_HANDLE); \
Note: See TracChangeset for help on using the changeset viewer.