提交 6e62e725 编写于 作者: D dxu

8001334: Remove use of JVM_* functions from java.io code

Summary: Replace JVM_* functions with direct system calls in java io area
Reviewed-by: alanb, uta, martin
上级 b38ca313
# #
# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
...@@ -384,9 +384,7 @@ OTHER_INCLUDES += \ ...@@ -384,9 +384,7 @@ OTHER_INCLUDES += \
ifeq ($(PLATFORM),windows) ifeq ($(PLATFORM),windows)
OTHER_LDLIBS += $(JVMLIB) ws2_32.lib \ OTHER_LDLIBS += $(JVMLIB) ws2_32.lib \
-libpath:$(LIBDIR) java.lib \ -libpath:$(LIBDIR) java.lib \
$(OBJDIR)/../../../../sun/java.net/net/$(OBJDIRNAME)/net.lib \ $(OBJDIR)/../../../../sun/java.net/net/$(OBJDIRNAME)/net.lib
$(OBJDIR)/../../../java.lang/java/$(OBJDIRNAME)/io_util.obj \
$(OBJDIR)/../../../java.lang/java/$(OBJDIRNAME)/FileDescriptor_md.obj
endif endif
ifeq ($(PLATFORM), linux) ifeq ($(PLATFORM), linux)
OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread $(LIBDL) OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet -lpthread $(LIBDL)
......
# #
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
...@@ -1957,8 +1957,6 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBNIO,\ ...@@ -1957,8 +1957,6 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBNIO,\
-lsendfile -ljava -lnet -lc,\ -lsendfile -ljava -lnet -lc,\
LDFLAGS_SUFFIX_windows:=jvm.lib ws2_32.lib $(WIN_JAVA_LIB) \ LDFLAGS_SUFFIX_windows:=jvm.lib ws2_32.lib $(WIN_JAVA_LIB) \
$(JDK_OUTPUTDIR)/objs/libnet/net.lib \ $(JDK_OUTPUTDIR)/objs/libnet/net.lib \
$(JDK_OUTPUTDIR)/objs/libjava/io_util.obj \
$(JDK_OUTPUTDIR)/objs/libjava/FileDescriptor_md.obj \
advapi32.lib,\ advapi32.lib,\
LDFLAGS_SUFFIX_macosx:=-ljava -lnet -pthread -framework CoreFoundation,\ LDFLAGS_SUFFIX_macosx:=-ljava -lnet -pthread -framework CoreFoundation,\
LDFLAGS_SUFFIX:=,\ LDFLAGS_SUFFIX:=,\
......
/* /*
* Copyright (c) 1999, 2000, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,10 +23,8 @@ ...@@ -23,10 +23,8 @@
* questions. * questions.
*/ */
#include "jni.h"
#include "jvm.h"
#include "jni_util.h" #include "jni_util.h"
#include "jlong.h" #include "jdk_util.h"
#include "java_lang_Float.h" #include "java_lang_Float.h"
#include "java_lang_Double.h" #include "java_lang_Double.h"
...@@ -88,7 +86,7 @@ Java_java_io_ObjectOutputStream_floatsToBytes(JNIEnv *env, ...@@ -88,7 +86,7 @@ Java_java_io_ObjectOutputStream_floatsToBytes(JNIEnv *env,
srcend = srcpos + nfloats; srcend = srcpos + nfloats;
for ( ; srcpos < srcend; srcpos++) { for ( ; srcpos < srcend; srcpos++) {
fval = (float) floats[srcpos]; fval = (float) floats[srcpos];
if (JVM_IsNaN(fval)) { /* collapse NaNs */ if (ISNANF(fval)) { /* collapse NaNs */
ival = 0x7fc00000; ival = 0x7fc00000;
} else { } else {
u.f = fval; u.f = fval;
...@@ -160,7 +158,7 @@ Java_java_io_ObjectOutputStream_doublesToBytes(JNIEnv *env, ...@@ -160,7 +158,7 @@ Java_java_io_ObjectOutputStream_doublesToBytes(JNIEnv *env,
srcend = srcpos + ndoubles; srcend = srcpos + ndoubles;
for ( ; srcpos < srcend; srcpos++) { for ( ; srcpos < srcend; srcpos++) {
dval = doubles[srcpos]; dval = doubles[srcpos];
if (JVM_IsNaN((double) dval)) { /* collapse NaNs */ if (ISNAND((double) dval)) { /* collapse NaNs */
lval = jint_to_jlong(0x7ff80000); lval = jint_to_jlong(0x7ff80000);
lval = jlong_shl(lval, 32); lval = jlong_shl(lval, 32);
} else { } else {
......
/* /*
* Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -47,10 +47,8 @@ readSingle(JNIEnv *env, jobject this, jfieldID fid) { ...@@ -47,10 +47,8 @@ readSingle(JNIEnv *env, jobject this, jfieldID fid) {
nread = IO_Read(fd, &ret, 1); nread = IO_Read(fd, &ret, 1);
if (nread == 0) { /* EOF */ if (nread == 0) { /* EOF */
return -1; return -1;
} else if (nread == JVM_IO_ERR) { /* error */ } else if (nread == -1) { /* error */
JNU_ThrowIOExceptionWithLastError(env, "Read error"); JNU_ThrowIOExceptionWithLastError(env, "Read error");
} else if (nread == JVM_IO_INTR) {
JNU_ThrowByName(env, "java/io/InterruptedIOException", NULL);
} }
return ret & 0xFF; return ret & 0xFF;
} }
...@@ -111,10 +109,8 @@ readBytes(JNIEnv *env, jobject this, jbyteArray bytes, ...@@ -111,10 +109,8 @@ readBytes(JNIEnv *env, jobject this, jbyteArray bytes,
nread = IO_Read(fd, buf, len); nread = IO_Read(fd, buf, len);
if (nread > 0) { if (nread > 0) {
(*env)->SetByteArrayRegion(env, bytes, off, nread, (jbyte *)buf); (*env)->SetByteArrayRegion(env, bytes, off, nread, (jbyte *)buf);
} else if (nread == JVM_IO_ERR) { } else if (nread == -1) {
JNU_ThrowIOExceptionWithLastError(env, "Read error"); JNU_ThrowIOExceptionWithLastError(env, "Read error");
} else if (nread == JVM_IO_INTR) {
JNU_ThrowByName(env, "java/io/InterruptedIOException", NULL);
} else { /* EOF */ } else { /* EOF */
nread = -1; nread = -1;
} }
...@@ -141,10 +137,8 @@ writeSingle(JNIEnv *env, jobject this, jint byte, jboolean append, jfieldID fid) ...@@ -141,10 +137,8 @@ writeSingle(JNIEnv *env, jobject this, jint byte, jboolean append, jfieldID fid)
} else { } else {
n = IO_Write(fd, &c, 1); n = IO_Write(fd, &c, 1);
} }
if (n == JVM_IO_ERR) { if (n == -1) {
JNU_ThrowIOExceptionWithLastError(env, "Write error"); JNU_ThrowIOExceptionWithLastError(env, "Write error");
} else if (n == JVM_IO_INTR) {
JNU_ThrowByName(env, "java/io/InterruptedIOException", NULL);
} }
} }
...@@ -194,12 +188,9 @@ writeBytes(JNIEnv *env, jobject this, jbyteArray bytes, ...@@ -194,12 +188,9 @@ writeBytes(JNIEnv *env, jobject this, jbyteArray bytes,
} else { } else {
n = IO_Write(fd, buf+off, len); n = IO_Write(fd, buf+off, len);
} }
if (n == JVM_IO_ERR) { if (n == -1) {
JNU_ThrowIOExceptionWithLastError(env, "Write error"); JNU_ThrowIOExceptionWithLastError(env, "Write error");
break; break;
} else if (n == JVM_IO_INTR) {
JNU_ThrowByName(env, "java/io/InterruptedIOException", NULL);
break;
} }
off += n; off += n;
len -= n; len -= n;
...@@ -214,11 +205,11 @@ void ...@@ -214,11 +205,11 @@ void
throwFileNotFoundException(JNIEnv *env, jstring path) throwFileNotFoundException(JNIEnv *env, jstring path)
{ {
char buf[256]; char buf[256];
jint n; size_t n;
jobject x; jobject x;
jstring why = NULL; jstring why = NULL;
n = JVM_GetLastErrorString(buf, sizeof(buf)); n = getLastErrorString(buf, sizeof(buf));
if (n > 0) { if (n > 0) {
why = JNU_NewStringPlatform(env, buf); why = JNU_NewStringPlatform(env, buf);
} }
......
/* /*
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -54,7 +54,7 @@ void writeBytes(JNIEnv *env, jobject this, jbyteArray bytes, jint off, ...@@ -54,7 +54,7 @@ void writeBytes(JNIEnv *env, jobject this, jbyteArray bytes, jint off,
jint len, jboolean append, jfieldID fid); jint len, jboolean append, jfieldID fid);
void fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags); void fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags);
void throwFileNotFoundException(JNIEnv *env, jstring path); void throwFileNotFoundException(JNIEnv *env, jstring path);
size_t getLastErrorString(char *buf, size_t len);
/* /*
* Macros for managing platform strings. The typical usage pattern is: * Macros for managing platform strings. The typical usage pattern is:
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,4 +23,24 @@ ...@@ -23,4 +23,24 @@
* questions. * questions.
*/ */
// Currently, there are no unix specific functions defined. #ifndef JDK_UTIL_MD_H
#define JDK_UTIL_MD_H
// checking for nanness
#ifdef __solaris__
#include <ieeefp.h>
#define ISNANF(f) isnanf(f)
#define ISNAND(d) isnand(d)
#elif defined(MACOSX)
#include <math.h>
#define ISNANF(f) isnan(f)
#define ISNAND(d) isnan(d)
#elif defined(__linux__) || defined(_ALLBSD_SOURCE)
#include <math.h>
#define ISNANF(f) isnanf(f)
#define ISNAND(d) isnan(d)
#else
#error "missing platform-specific definition here"
#endif
#endif /* JDK_UTIL_MD_H */
/* /*
* Copyright (c) 1997, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,9 +23,8 @@ ...@@ -23,9 +23,8 @@
* questions. * questions.
*/ */
#include "jni.h"
#include "jni_util.h"
#include "jvm.h" #include "jvm.h"
#include "io_util_md.h"
#include "java_io_FileDescriptor.h" #include "java_io_FileDescriptor.h"
...@@ -51,8 +50,8 @@ Java_java_io_FileDescriptor_initIDs(JNIEnv *env, jclass fdClass) { ...@@ -51,8 +50,8 @@ Java_java_io_FileDescriptor_initIDs(JNIEnv *env, jclass fdClass) {
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_java_io_FileDescriptor_sync(JNIEnv *env, jobject this) { Java_java_io_FileDescriptor_sync(JNIEnv *env, jobject this) {
int fd = (*env)->GetIntField(env, this, IO_fd_fdID); FD fd = THIS_FD(this);
if (JVM_Sync(fd) == -1) { if (IO_Sync(fd) == -1) {
JNU_ThrowByName(env, "java/io/SyncFailedException", "sync failed"); JNU_ThrowByName(env, "java/io/SyncFailedException", "sync failed");
} }
} }
/* /*
* Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -77,7 +77,7 @@ Java_java_io_UnixFileSystem_canonicalize0(JNIEnv *env, jobject this, ...@@ -77,7 +77,7 @@ Java_java_io_UnixFileSystem_canonicalize0(JNIEnv *env, jobject this,
WITH_PLATFORM_STRING(env, pathname, path) { WITH_PLATFORM_STRING(env, pathname, path) {
char canonicalPath[JVM_MAXPATHLEN]; char canonicalPath[JVM_MAXPATHLEN];
if (canonicalize(JVM_NativePath((char *)path), if (canonicalize((char *)path,
canonicalPath, JVM_MAXPATHLEN) < 0) { canonicalPath, JVM_MAXPATHLEN) < 0) {
JNU_ThrowIOExceptionWithLastError(env, "Bad pathname"); JNU_ThrowIOExceptionWithLastError(env, "Bad pathname");
} else { } else {
...@@ -241,20 +241,19 @@ Java_java_io_UnixFileSystem_createFileExclusively(JNIEnv *env, jclass cls, ...@@ -241,20 +241,19 @@ Java_java_io_UnixFileSystem_createFileExclusively(JNIEnv *env, jclass cls,
jboolean rv = JNI_FALSE; jboolean rv = JNI_FALSE;
WITH_PLATFORM_STRING(env, pathname, path) { WITH_PLATFORM_STRING(env, pathname, path) {
int fd; FD fd;
if (!strcmp (path, "/")) { /* The root directory always exists */
fd = JVM_EEXIST; /* The root directory always exists */ if (strcmp (path, "/")) {
} else { fd = handleOpen(path, O_RDWR | O_CREAT | O_EXCL, 0666);
fd = JVM_Open(path, JVM_O_RDWR | JVM_O_CREAT | JVM_O_EXCL, 0666);
}
if (fd < 0) { if (fd < 0) {
if (fd != JVM_EEXIST) { if (errno != EEXIST)
JNU_ThrowIOExceptionWithLastError(env, path); JNU_ThrowIOExceptionWithLastError(env, path);
}
} else { } else {
JVM_Close(fd); if (close(fd) == -1)
JNU_ThrowIOExceptionWithLastError(env, path);
rv = JNI_TRUE; rv = JNI_TRUE;
} }
}
} END_PLATFORM_STRING(env, path); } END_PLATFORM_STRING(env, path);
return rv; return rv;
} }
......
/* /*
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -29,6 +29,15 @@ ...@@ -29,6 +29,15 @@
#include "io_util.h" #include "io_util.h"
#include "io_util_md.h" #include "io_util_md.h"
#include <string.h> #include <string.h>
#include <unistd.h>
#ifdef __solaris__
#include <sys/filio.h>
#endif
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
#include <sys/ioctl.h>
#endif
#ifdef MACOSX #ifdef MACOSX
...@@ -62,6 +71,28 @@ jstring newStringPlatform(JNIEnv *env, const char* str) ...@@ -62,6 +71,28 @@ jstring newStringPlatform(JNIEnv *env, const char* str)
} }
#endif #endif
FD
handleOpen(const char *path, int oflag, int mode) {
FD fd;
RESTARTABLE(open64(path, oflag, mode), fd);
if (fd != -1) {
struct stat64 buf64;
int result;
RESTARTABLE(fstat64(fd, &buf64), result);
if (result != -1) {
if (S_ISDIR(buf64.st_mode)) {
close(fd);
errno = EISDIR;
fd = -1;
}
} else {
close(fd);
fd = -1;
}
}
return fd;
}
void void
fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags) fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
{ {
...@@ -74,8 +105,8 @@ fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags) ...@@ -74,8 +105,8 @@ fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
while ((p > ps) && (*p == '/')) while ((p > ps) && (*p == '/'))
*p-- = '\0'; *p-- = '\0';
#endif #endif
fd = JVM_Open(ps, flags, 0666); fd = handleOpen(ps, flags, 0666);
if (fd >= 0) { if (fd != -1) {
SET_FD(this, fd, fid); SET_FD(this, fd, fid);
} else { } else {
throwFileNotFoundException(env, path); throwFileNotFoundException(env, path);
...@@ -83,7 +114,6 @@ fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags) ...@@ -83,7 +114,6 @@ fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
} END_PLATFORM_STRING(env, ps); } END_PLATFORM_STRING(env, ps);
} }
void void
fileClose(JNIEnv *env, jobject this, jfieldID fid) fileClose(JNIEnv *env, jobject this, jfieldID fid)
{ {
...@@ -114,7 +144,89 @@ fileClose(JNIEnv *env, jobject this, jfieldID fid) ...@@ -114,7 +144,89 @@ fileClose(JNIEnv *env, jobject this, jfieldID fid)
dup2(devnull, fd); dup2(devnull, fd);
close(devnull); close(devnull);
} }
} else if (JVM_Close(fd) == -1) { } else if (close(fd) == -1) {
JNU_ThrowIOExceptionWithLastError(env, "close failed"); JNU_ThrowIOExceptionWithLastError(env, "close failed");
} }
} }
ssize_t
handleRead(FD fd, void *buf, jint len)
{
ssize_t result;
RESTARTABLE(read(fd, buf, len), result);
return result;
}
ssize_t
handleWrite(FD fd, const void *buf, jint len)
{
ssize_t result;
RESTARTABLE(write(fd, buf, len), result);
return result;
}
jint
handleAvailable(FD fd, jlong *pbytes)
{
int mode;
struct stat64 buf64;
jlong size = -1, current = -1;
int result;
RESTARTABLE(fstat64(fd, &buf64), result);
if (result != -1) {
mode = buf64.st_mode;
if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
int n;
int result;
RESTARTABLE(ioctl(fd, FIONREAD, &n), result);
if (result >= 0) {
*pbytes = n;
return 1;
}
} else if (S_ISREG(mode)) {
size = buf64.st_size;
}
}
if ((current = lseek64(fd, 0, SEEK_CUR)) == -1) {
return 0;
}
if (size < current) {
if ((size = lseek64(fd, 0, SEEK_END)) == -1)
return 0;
else if (lseek64(fd, current, SEEK_SET) == -1)
return 0;
}
if (size >= current) {
*pbytes = size - current;
return 1;
} else {
return 0;
}
}
jint
handleSetLength(FD fd, jlong length)
{
int result;
RESTARTABLE(ftruncate64(fd, length), result);
return result;
}
size_t
getLastErrorString(char *buf, size_t len)
{
if (errno == 0 || len < 1) return 0;
const char *err = strerror(errno);
size_t n = strlen(err);
if (n >= len)
n = len - 1;
strncpy(buf, err, n);
buf[n] = '\0';
return n;
}
/* /*
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
* questions. * questions.
*/ */
#include "jni.h"
#include "jni_util.h" #include "jni_util.h"
/* /*
...@@ -31,6 +30,18 @@ ...@@ -31,6 +30,18 @@
*/ */
#define FD jint #define FD jint
/*
* Prototypes for functions in io_util_md.c called from io_util.c,
* FileDescriptor.c, FileInputStream.c, FileOutputStream.c,
* UnixFileSystem_md.c
*/
ssize_t handleWrite(FD fd, const void *buf, jint len);
ssize_t handleRead(FD fd, void *buf, jint len);
jint handleAvailable(FD fd, jlong *pbytes);
jint handleSetLength(FD fd, jlong length);
FD handleOpen(const char *path, int oflag, int mode);
/* /*
* Macros to set/get fd from the java.io.FileDescriptor. These * Macros to set/get fd from the java.io.FileDescriptor. These
* macros rely on having an appropriately defined 'this' object * macros rely on having an appropriately defined 'this' object
...@@ -53,21 +64,40 @@ ...@@ -53,21 +64,40 @@
#define THIS_FD(obj) (*env)->GetIntField(env, obj, IO_fd_fdID) #define THIS_FD(obj) (*env)->GetIntField(env, obj, IO_fd_fdID)
/* /*
* Route the routines through VM * Route the routines
*/ */
#define IO_Append JVM_Write #define IO_Sync fsync
#define IO_Write JVM_Write #define IO_Read handleRead
#define IO_Sync JVM_Sync #define IO_Write handleWrite
#define IO_Read JVM_Read #define IO_Append handleWrite
#define IO_Lseek JVM_Lseek #define IO_Available handleAvailable
#define IO_Available JVM_Available #define IO_SetLength handleSetLength
#define IO_SetLength JVM_SetLength
#ifdef _ALLBSD_SOURCE
#define open64 open
#define fstat64 fstat
#define stat64 stat
#define lseek64 lseek
#define ftruncate64 ftruncate
#define IO_Lseek lseek
#else
#define IO_Lseek lseek64
#endif
/* /*
* On Solaris, the handle field is unused * On Solaris, the handle field is unused
*/ */
#define SET_HANDLE(fd) return (jlong)-1 #define SET_HANDLE(fd) return (jlong)-1
/*
* Retry the operation if it is interrupted
*/
#define RESTARTABLE(_cmd, _result) do { \
do { \
_result = _cmd; \
} while((_result == -1) && (errno == EINTR)); \
} while(0)
/* /*
* IO helper function(s) * IO helper function(s)
*/ */
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -28,6 +28,11 @@ ...@@ -28,6 +28,11 @@
#define JDK_UTIL_MD_H #define JDK_UTIL_MD_H
#include "jni.h" #include "jni.h"
#include <float.h>
// checking for nanness
#define ISNANF(f) _isnan(f)
#define ISNAND(d) _isnan(d)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
......
/* /*
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -208,7 +208,7 @@ pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE) { ...@@ -208,7 +208,7 @@ pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE) {
return pathbuf; return pathbuf;
} }
jlong FD
winFileHandleOpen(JNIEnv *env, jstring path, int flags) winFileHandleOpen(JNIEnv *env, jstring path, int flags)
{ {
const DWORD access = const DWORD access =
...@@ -264,7 +264,7 @@ winFileHandleOpen(JNIEnv *env, jstring path, int flags) ...@@ -264,7 +264,7 @@ winFileHandleOpen(JNIEnv *env, jstring path, int flags)
void void
fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags) fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
{ {
jlong h = winFileHandleOpen(env, path, flags); FD h = winFileHandleOpen(env, path, flags);
if (h >= 0) { if (h >= 0) {
SET_FD(this, h, fid); SET_FD(this, h, fid);
} }
...@@ -274,12 +274,12 @@ fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags) ...@@ -274,12 +274,12 @@ fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags)
old C style int fd as is used in HPI layer */ old C style int fd as is used in HPI layer */
static int static int
handleNonSeekAvailable(jlong, long *); handleNonSeekAvailable(FD, long *);
static int static int
handleStdinAvailable(jlong, long *); handleStdinAvailable(FD, long *);
int int
handleAvailable(jlong fd, jlong *pbytes) { handleAvailable(FD fd, jlong *pbytes) {
HANDLE h = (HANDLE)fd; HANDLE h = (HANDLE)fd;
DWORD type = 0; DWORD type = 0;
...@@ -317,7 +317,7 @@ handleAvailable(jlong fd, jlong *pbytes) { ...@@ -317,7 +317,7 @@ handleAvailable(jlong fd, jlong *pbytes) {
} }
static int static int
handleNonSeekAvailable(jlong fd, long *pbytes) { handleNonSeekAvailable(FD fd, long *pbytes) {
/* This is used for available on non-seekable devices /* This is used for available on non-seekable devices
* (like both named and anonymous pipes, such as pipes * (like both named and anonymous pipes, such as pipes
* connected to an exec'd process). * connected to an exec'd process).
...@@ -346,7 +346,7 @@ handleNonSeekAvailable(jlong fd, long *pbytes) { ...@@ -346,7 +346,7 @@ handleNonSeekAvailable(jlong fd, long *pbytes) {
} }
static int static int
handleStdinAvailable(jlong fd, long *pbytes) { handleStdinAvailable(FD fd, long *pbytes) {
HANDLE han; HANDLE han;
DWORD numEventsRead = 0; /* Number of events read from buffer */ DWORD numEventsRead = 0; /* Number of events read from buffer */
DWORD numEvents = 0; /* Number of events in buffer */ DWORD numEvents = 0; /* Number of events in buffer */
...@@ -412,8 +412,8 @@ handleStdinAvailable(jlong fd, long *pbytes) { ...@@ -412,8 +412,8 @@ handleStdinAvailable(jlong fd, long *pbytes) {
* denied". * denied".
*/ */
JNIEXPORT int int
handleSync(jlong fd) { handleSync(FD fd) {
/* /*
* From the documentation: * From the documentation:
* *
...@@ -443,7 +443,7 @@ handleSync(jlong fd) { ...@@ -443,7 +443,7 @@ handleSync(jlong fd) {
int int
handleSetLength(jlong fd, jlong length) { handleSetLength(FD fd, jlong length) {
HANDLE h = (HANDLE)fd; HANDLE h = (HANDLE)fd;
long high = (long)(length >> 32); long high = (long)(length >> 32);
DWORD ret; DWORD ret;
...@@ -459,7 +459,7 @@ handleSetLength(jlong fd, jlong length) { ...@@ -459,7 +459,7 @@ handleSetLength(jlong fd, jlong length) {
JNIEXPORT JNIEXPORT
jint jint
handleRead(jlong fd, void *buf, jint len) handleRead(FD fd, void *buf, jint len)
{ {
DWORD read = 0; DWORD read = 0;
BOOL result = 0; BOOL result = 0;
...@@ -482,7 +482,7 @@ handleRead(jlong fd, void *buf, jint len) ...@@ -482,7 +482,7 @@ handleRead(jlong fd, void *buf, jint len)
return (jint)read; return (jint)read;
} }
static jint writeInternal(jlong fd, const void *buf, jint len, jboolean append) static jint writeInternal(FD fd, const void *buf, jint len, jboolean append)
{ {
BOOL result = 0; BOOL result = 0;
DWORD written = 0; DWORD written = 0;
...@@ -510,13 +510,11 @@ static jint writeInternal(jlong fd, const void *buf, jint len, jboolean append) ...@@ -510,13 +510,11 @@ static jint writeInternal(jlong fd, const void *buf, jint len, jboolean append)
return (jint)written; return (jint)written;
} }
JNIEXPORT jint handleWrite(FD fd, const void *buf, jint len) {
jint handleWrite(jlong fd, const void *buf, jint len) {
return writeInternal(fd, buf, len, JNI_FALSE); return writeInternal(fd, buf, len, JNI_FALSE);
} }
JNIEXPORT jint handleAppend(FD fd, const void *buf, jint len) {
jint handleAppend(jlong fd, const void *buf, jint len) {
return writeInternal(fd, buf, len, JNI_TRUE); return writeInternal(fd, buf, len, JNI_TRUE);
} }
...@@ -545,7 +543,7 @@ handleClose(JNIEnv *env, jobject this, jfieldID fid) ...@@ -545,7 +543,7 @@ handleClose(JNIEnv *env, jobject this, jfieldID fid)
} }
jlong jlong
handleLseek(jlong fd, jlong offset, jint whence) handleLseek(FD fd, jlong offset, jint whence)
{ {
LARGE_INTEGER pos, distance; LARGE_INTEGER pos, distance;
DWORD lowPos = 0; DWORD lowPos = 0;
...@@ -569,3 +567,44 @@ handleLseek(jlong fd, jlong offset, jint whence) ...@@ -569,3 +567,44 @@ handleLseek(jlong fd, jlong offset, jint whence)
} }
return long_to_jlong(pos.QuadPart); return long_to_jlong(pos.QuadPart);
} }
size_t
getLastErrorString(char *buf, size_t len)
{
DWORD errval;
if (len > 0) {
if ((errval = GetLastError()) != 0) {
// DOS error
size_t n = (size_t)FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errval,
0,
buf,
(DWORD)len,
NULL);
if (n > 3) {
// Drop final '.', CR, LF
if (buf[n - 1] == '\n') n--;
if (buf[n - 1] == '\r') n--;
if (buf[n - 1] == '.') n--;
buf[n] = '\0';
}
return n;
}
if (errno != 0) {
// C runtime error that has no corresponding DOS error code
const char *err = strerror(errno);
size_t n = strlen(err);
if (n >= len)
n = len - 1;
strncpy(buf, err, n);
buf[n] = '\0';
return n;
}
}
return 0;
}
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -27,7 +27,12 @@ ...@@ -27,7 +27,12 @@
#include "jni_util.h" #include "jni_util.h"
/* /*
* Prototypes for functions in io_util_md.c called from io_util, * Macros to use the right data type for file descriptors
*/
#define FD jlong
/*
* Prototypes for functions in io_util_md.c called from io_util.c,
* FileDescriptor.c, FileInputStream.c, FileOutputStream.c * FileDescriptor.c, FileInputStream.c, FileOutputStream.c
*/ */
WCHAR* pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE); WCHAR* pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE);
...@@ -35,26 +40,20 @@ WCHAR* fileToNTPath(JNIEnv *env, jobject file, jfieldID id); ...@@ -35,26 +40,20 @@ WCHAR* fileToNTPath(JNIEnv *env, jobject file, jfieldID id);
WCHAR* getPrefixed(const WCHAR* path, int pathlen); WCHAR* getPrefixed(const WCHAR* path, int pathlen);
WCHAR* currentDir(int di); WCHAR* currentDir(int di);
int currentDirLength(const WCHAR* path, int pathlen); int currentDirLength(const WCHAR* path, int pathlen);
void fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags); int handleAvailable(FD fd, jlong *pbytes);
int handleAvailable(jlong fd, jlong *pbytes); int handleSync(FD fd);
JNIEXPORT int handleSync(jlong fd); int handleSetLength(FD fd, jlong length);
int handleSetLength(jlong fd, jlong length); JNIEXPORT jint handleRead(FD fd, void *buf, jint len);
JNIEXPORT jint handleRead(jlong fd, void *buf, jint len); jint handleWrite(FD fd, const void *buf, jint len);
JNIEXPORT jint handleWrite(jlong fd, const void *buf, jint len); jint handleAppend(FD fd, const void *buf, jint len);
JNIEXPORT jint handleAppend(jlong fd, const void *buf, jint len);
jint handleClose(JNIEnv *env, jobject this, jfieldID fid); jint handleClose(JNIEnv *env, jobject this, jfieldID fid);
jlong handleLseek(jlong fd, jlong offset, jint whence); jlong handleLseek(FD fd, jlong offset, jint whence);
/* /*
* Returns an opaque handle to file named by "path". If an error occurs, * Returns an opaque handle to file named by "path". If an error occurs,
* returns -1 and an exception is pending. * returns -1 and an exception is pending.
*/ */
jlong winFileHandleOpen(JNIEnv *env, jstring path, int flags); FD winFileHandleOpen(JNIEnv *env, jstring path, int flags);
/*
* Macros to use the right data type for file descriptors
*/
#define FD jlong
/* /*
* Macros to set/get fd from the java.io.FileDescriptor. * Macros to set/get fd from the java.io.FileDescriptor.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册