jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c
changeset 2057 3acf8e5e2ca0
parent 715 f16baef3a20e
child 2446 07047237e4d4
equal deleted inserted replaced
2056:115e09b7a004 2057:3acf8e5e2ca0
     1 /*
     1 /*
     2  * Copyright 2000-2008 Sun Microsystems, Inc.  All Rights Reserved.
     2  * Copyright 2000-2009 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Sun designates this
     7  * published by the Free Software Foundation.  Sun designates this
    29 #include "jlong.h"
    29 #include "jlong.h"
    30 #include <sys/mman.h>
    30 #include <sys/mman.h>
    31 #include <sys/stat.h>
    31 #include <sys/stat.h>
    32 #include "sun_nio_ch_FileChannelImpl.h"
    32 #include "sun_nio_ch_FileChannelImpl.h"
    33 #include "java_lang_Integer.h"
    33 #include "java_lang_Integer.h"
    34 #include "java_lang_Long.h"
       
    35 #include "nio.h"
    34 #include "nio.h"
    36 #include "nio_util.h"
    35 #include "nio_util.h"
    37 #include <dlfcn.h>
    36 #include <dlfcn.h>
    38 
    37 
    39 static jfieldID chan_fd;        /* jobject 'fd' in sun.io.FileChannelImpl */
    38 static jfieldID chan_fd;        /* jobject 'fd' in sun.io.FileChannelImpl */
   143                   munmap(a, (size_t)len),
   142                   munmap(a, (size_t)len),
   144                   "Unmap failed");
   143                   "Unmap failed");
   145 }
   144 }
   146 
   145 
   147 
   146 
   148 JNIEXPORT jint JNICALL
       
   149 Java_sun_nio_ch_FileChannelImpl_truncate0(JNIEnv *env, jobject this,
       
   150                                           jobject fdo, jlong size)
       
   151 {
       
   152     return handle(env,
       
   153                   ftruncate64(fdval(env, fdo), size),
       
   154                   "Truncation failed");
       
   155 }
       
   156 
       
   157 
       
   158 JNIEXPORT jint JNICALL
       
   159 Java_sun_nio_ch_FileChannelImpl_force0(JNIEnv *env, jobject this,
       
   160                                        jobject fdo, jboolean md)
       
   161 {
       
   162     jint fd = fdval(env, fdo);
       
   163     int result = 0;
       
   164 
       
   165     if (md == JNI_FALSE) {
       
   166         result = fdatasync(fd);
       
   167     } else {
       
   168         result = fsync(fd);
       
   169     }
       
   170     return handle(env, result, "Force failed");
       
   171 }
       
   172 
       
   173 
       
   174 JNIEXPORT jlong JNICALL
   147 JNIEXPORT jlong JNICALL
   175 Java_sun_nio_ch_FileChannelImpl_position0(JNIEnv *env, jobject this,
   148 Java_sun_nio_ch_FileChannelImpl_position0(JNIEnv *env, jobject this,
   176                                           jobject fdo, jlong offset)
   149                                           jobject fdo, jlong offset)
   177 {
   150 {
   178     jint fd = fdval(env, fdo);
   151     jint fd = fdval(env, fdo);
   182         result = lseek64(fd, 0, SEEK_CUR);
   155         result = lseek64(fd, 0, SEEK_CUR);
   183     } else {
   156     } else {
   184         result = lseek64(fd, offset, SEEK_SET);
   157         result = lseek64(fd, offset, SEEK_SET);
   185     }
   158     }
   186     return handle(env, result, "Position failed");
   159     return handle(env, result, "Position failed");
   187 }
       
   188 
       
   189 
       
   190 JNIEXPORT jlong JNICALL
       
   191 Java_sun_nio_ch_FileChannelImpl_size0(JNIEnv *env, jobject this, jobject fdo)
       
   192 {
       
   193     struct stat64 fbuf;
       
   194 
       
   195     if (fstat64(fdval(env, fdo), &fbuf) < 0)
       
   196         return handle(env, -1, "Size failed");
       
   197     return fbuf.st_size;
       
   198 }
   160 }
   199 
   161 
   200 
   162 
   201 JNIEXPORT void JNICALL
   163 JNIEXPORT void JNICALL
   202 Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo)
   164 Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo)
   278         }
   240         }
   279         return result;
   241         return result;
   280     }
   242     }
   281 #endif
   243 #endif
   282 }
   244 }
   283 
       
   284 JNIEXPORT jint JNICALL
       
   285 Java_sun_nio_ch_FileChannelImpl_lock0(JNIEnv *env, jobject this, jobject fdo,
       
   286                                       jboolean block, jlong pos, jlong size,
       
   287                                       jboolean shared)
       
   288 {
       
   289     jint fd = fdval(env, fdo);
       
   290     jint lockResult = 0;
       
   291     int cmd = 0;
       
   292     struct flock64 fl;
       
   293 
       
   294     fl.l_whence = SEEK_SET;
       
   295     if (size == (jlong)java_lang_Long_MAX_VALUE) {
       
   296         fl.l_len = (off64_t)0;
       
   297     } else {
       
   298         fl.l_len = (off64_t)size;
       
   299     }
       
   300     fl.l_start = (off64_t)pos;
       
   301     if (shared == JNI_TRUE) {
       
   302         fl.l_type = F_RDLCK;
       
   303     } else {
       
   304         fl.l_type = F_WRLCK;
       
   305     }
       
   306     if (block == JNI_TRUE) {
       
   307         cmd = F_SETLKW64;
       
   308     } else {
       
   309         cmd = F_SETLK64;
       
   310     }
       
   311     lockResult = fcntl(fd, cmd, &fl);
       
   312     if (lockResult < 0) {
       
   313         if ((cmd == F_SETLK64) && (errno == EAGAIN))
       
   314             return sun_nio_ch_FileChannelImpl_NO_LOCK;
       
   315         if (errno == EINTR)
       
   316             return sun_nio_ch_FileChannelImpl_INTERRUPTED;
       
   317         JNU_ThrowIOExceptionWithLastError(env, "Lock failed");
       
   318     }
       
   319     return 0;
       
   320 }
       
   321 
       
   322 
       
   323 JNIEXPORT void JNICALL
       
   324 Java_sun_nio_ch_FileChannelImpl_release0(JNIEnv *env, jobject this,
       
   325                                          jobject fdo, jlong pos, jlong size)
       
   326 {
       
   327     jint fd = fdval(env, fdo);
       
   328     jint lockResult = 0;
       
   329     struct flock64 fl;
       
   330     int cmd = F_SETLK64;
       
   331 
       
   332     fl.l_whence = SEEK_SET;
       
   333     if (size == (jlong)java_lang_Long_MAX_VALUE) {
       
   334         fl.l_len = (off64_t)0;
       
   335     } else {
       
   336         fl.l_len = (off64_t)size;
       
   337     }
       
   338     fl.l_start = (off64_t)pos;
       
   339     fl.l_type = F_UNLCK;
       
   340     lockResult = fcntl(fd, cmd, &fl);
       
   341     if (lockResult < 0) {
       
   342         JNU_ThrowIOExceptionWithLastError(env, "Release failed");
       
   343     }
       
   344 }