Changeset 373


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
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/openjdk/jdk/src/share/native/java/io/FileInputStream.c

    r278 r373  
    7878    jlong end = jlong_zero;
    7979    FD fd = GET_FD(this, fis_fd);
    80     if (fd == -1) {
     80    if (!VALID_FD(fd)) {
    8181        JNU_ThrowIOException (env, "Stream Closed");
    8282        return 0;
     
    9494    jlong ret;
    9595    FD fd = GET_FD(this, fis_fd);
    96     if (fd == -1) {
     96    if (!VALID_FD(fd)) {
    9797        JNU_ThrowIOException (env, "Stream Closed");
    9898        return 0;
  • trunk/openjdk/jdk/src/share/native/java/io/RandomAccessFile.c

    r278 r373  
    9191    jlong ret;
    9292
    93     fd = GET_FD(this, raf_fd);
    94     if (fd == -1) {
     93    ASSIGN_FD(fd, this, raf_fd);
     94    if (!VALID_FD(fd)) {
    9595        JNU_ThrowIOException(env, "Stream Closed");
    9696        return -1;
     
    108108    jlong end = jlong_zero;
    109109
    110     fd = GET_FD(this, raf_fd);
    111     if (fd == -1) {
     110    ASSIGN_FD(fd, this, raf_fd);
     111    if (!VALID_FD(fd)) {
    112112        JNU_ThrowIOException(env, "Stream Closed");
    113113        return -1;
     
    129129    FD fd;
    130130
    131     fd = GET_FD(this, raf_fd);
    132     if (fd == -1) {
     131    ASSIGN_FD(fd, this, raf_fd);
     132    if (!VALID_FD(fd)) {
    133133        JNU_ThrowIOException(env, "Stream Closed");
    134134        return;
     
    148148    jlong cur;
    149149
    150     fd = GET_FD(this, raf_fd);
    151     if (fd == -1) {
     150    ASSIGN_FD(fd, this, raf_fd);
     151    if (!VALID_FD(fd)) {
    152152        JNU_ThrowIOException(env, "Stream Closed");
    153153        return;
  • trunk/openjdk/jdk/src/share/native/java/io/io_util.c

    r278 r373  
    4141    char ret;
    4242    FD fd = GET_FD(this, fid);
    43     if (fd == -1) {
     43    if (!VALID_FD(fd)) {
    4444        JNU_ThrowIOException(env, "Stream Closed");
    4545        return -1;
     
    104104    }
    105105
    106     fd = GET_FD(this, fid);
    107     if (fd == -1) {
     106    ASSIGN_FD(fd, this, fid);
     107    if (!VALID_FD(fd)) {
    108108        JNU_ThrowIOException(env, "Stream Closed");
    109109        nread = -1;
     
    133133    jint n;
    134134    FD fd = GET_FD(this, fid);
    135     if (fd == -1) {
     135    if (!VALID_FD(fd)) {
    136136        JNU_ThrowIOException(env, "Stream Closed");
    137137        return;
     
    181181        off = 0;
    182182        while (len > 0) {
    183             fd = GET_FD(this, fid);
    184             if (fd == -1) {
     183            ASSIGN_FD(fd, this, fid);
     184            if (!VALID_FD(fd)) {
    185185                JNU_ThrowIOException(env, "Stream Closed");
    186186                break;
  • trunk/openjdk/jdk/src/solaris/native/java/io/io_util_md.h

    r278 r373  
    4848        -1 : (*env)->GetIntField(env, (*env)->GetObjectField(env, (this), (fid)), IO_fd_fdID)
    4949
     50#define ASSIGN_FD(fd, this, fid) \
     51    do { \
     52        fd = (*env)->GetObjectField(env, (this), (fid)) == NULL ? \
     53            -1 : (*env)->GetIntField(env, (*env)->GetObjectField(env, (this), (fid)), IO_fd_fdID); \
     54    } while(0)
     55
     56#define VALID_FD(fd) (fd != -1)
     57
    5058/*
    5159 * Macros to set/get fd when inside java.io.FileDescriptor
     
    6674 * On Solaris, the handle field is unused
    6775 */
    68 #define SET_HANDLE(fd) return (jlong)-1
     76#define RETURN_HANDLE(fd) return (jlong)-1
    6977
    7078/*
  • 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.