diff options
author | Elliott Hughes <enh@google.com> | 2011-05-27 17:34:46 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-05-27 17:34:46 -0700 |
commit | ee100f24d3b9d538dfc0ec9c9e74b6670e0a2a1f (patch) | |
tree | 35ab507e63eab663b8b10793635dee8b4bcf36d9 /luni | |
parent | 5722fb8a3c56310ad3e9394e7bd9bb0fd17917a9 (diff) | |
parent | 9b510df35b57946d843ffc34cf23fdcfc84c5220 (diff) | |
download | libcore-ee100f24d3b9d538dfc0ec9c9e74b6670e0a2a1f.zip libcore-ee100f24d3b9d538dfc0ec9c9e74b6670e0a2a1f.tar.gz libcore-ee100f24d3b9d538dfc0ec9c9e74b6670e0a2a1f.tar.bz2 |
Merge "Make ErrnoException a checked exception."
Diffstat (limited to 'luni')
18 files changed, 96 insertions, 58 deletions
diff --git a/luni/src/main/java/java/lang/ProcessManager.java b/luni/src/main/java/java/lang/ProcessManager.java index f5afedb..c480185 100644 --- a/luni/src/main/java/java/lang/ProcessManager.java +++ b/luni/src/main/java/java/lang/ProcessManager.java @@ -105,7 +105,7 @@ final class ProcessManager { waitForMoreChildren(); continue; } else { - throw errnoException; + throw new AssertionError(errnoException); } } } diff --git a/luni/src/main/java/java/net/InetAddress.java b/luni/src/main/java/java/net/InetAddress.java index a507f82..9009226 100644 --- a/luni/src/main/java/java/net/InetAddress.java +++ b/luni/src/main/java/java/net/InetAddress.java @@ -375,7 +375,7 @@ public class InetAddress implements Serializable { * if the address lookup fails. */ public static InetAddress getLocalHost() throws UnknownHostException { - String host = Libcore.os.uname().nodename; // Can only throw EFAULT (which can't happen). + String host = Libcore.os.uname().nodename; return lookupHostByName(host)[0]; } diff --git a/luni/src/main/java/java/net/PlainDatagramSocketImpl.java b/luni/src/main/java/java/net/PlainDatagramSocketImpl.java index f27db94..5d01469 100644 --- a/luni/src/main/java/java/net/PlainDatagramSocketImpl.java +++ b/luni/src/main/java/java/net/PlainDatagramSocketImpl.java @@ -28,6 +28,7 @@ import java.net.NetworkInterface; import java.net.SocketAddress; import java.net.SocketException; import java.net.UnknownHostException; +import libcore.io.ErrnoException; import libcore.io.IoBridge; import libcore.io.Libcore; import libcore.io.StructGroupReq; @@ -211,7 +212,11 @@ public class PlainDatagramSocketImpl extends DatagramSocketImpl { @Override public void disconnect() { - Libcore.os.connect(fd, InetAddress.UNSPECIFIED, 0); + try { + Libcore.os.connect(fd, InetAddress.UNSPECIFIED, 0); + } catch (ErrnoException errnoException) { + throw new AssertionError(errnoException); + } connectedPort = -1; connectedAddress = null; isNativeConnected = false; diff --git a/luni/src/main/java/java/nio/FileChannelImpl.java b/luni/src/main/java/java/nio/FileChannelImpl.java index bc13efd..fc263b2 100644 --- a/luni/src/main/java/java/nio/FileChannelImpl.java +++ b/luni/src/main/java/java/nio/FileChannelImpl.java @@ -118,13 +118,18 @@ final class FileChannelImpl extends FileChannel { flock.l_whence = (short) SEEK_SET; flock.l_start = position; flock.l_len = translateLockLength(size); - if (Libcore.os.fcntlFlock(fd, wait ? F_SETLKW64 : F_SETLK64, flock) == -1) { - // Lock acquisition failed. - removeLock(pendingLock); - return null; - } - return pendingLock; + boolean success = false; + try { + success = (Libcore.os.fcntlFlock(fd, wait ? F_SETLKW64 : F_SETLK64, flock) != -1); + } catch (ErrnoException errnoException) { + throw errnoException.rethrowAsIOException(); + } finally { + if (!success) { + removeLock(pendingLock); + } + } + return success ? pendingLock : null; } private static long translateLockLength(long byteCount) { diff --git a/luni/src/main/java/java/nio/SelectorImpl.java b/luni/src/main/java/java/nio/SelectorImpl.java index dfd3270..786e05f 100644 --- a/luni/src/main/java/java/nio/SelectorImpl.java +++ b/luni/src/main/java/java/nio/SelectorImpl.java @@ -175,7 +175,11 @@ final class SelectorImpl extends AbstractSelector { if (isBlock) { begin(); } - rc = Libcore.os.poll(pollFds.array(), (int) timeout); + try { + rc = Libcore.os.poll(pollFds.array(), (int) timeout); + } catch (ErrnoException errnoException) { + throw errnoException.rethrowAsIOException(); + } } finally { if (isBlock) { end(); diff --git a/luni/src/main/java/java/nio/SocketChannelImpl.java b/luni/src/main/java/java/nio/SocketChannelImpl.java index 9f8c690..0edb614 100644 --- a/luni/src/main/java/java/nio/SocketChannelImpl.java +++ b/luni/src/main/java/java/nio/SocketChannelImpl.java @@ -201,7 +201,12 @@ class SocketChannelImpl extends SocketChannel implements FileDescriptorChannel { } private void initLocalAddressAndPort() { - SocketAddress sa = Libcore.os.getsockname(fd); + SocketAddress sa; + try { + sa = Libcore.os.getsockname(fd); + } catch (ErrnoException errnoException) { + throw new AssertionError(errnoException); + } InetSocketAddress isa = (InetSocketAddress) sa; localAddress = isa.getAddress(); localPort = isa.getPort(); diff --git a/luni/src/main/java/libcore/io/BlockGuardOs.java b/luni/src/main/java/libcore/io/BlockGuardOs.java index e77e0bb..d664476 100644 --- a/luni/src/main/java/libcore/io/BlockGuardOs.java +++ b/luni/src/main/java/libcore/io/BlockGuardOs.java @@ -32,7 +32,7 @@ public class BlockGuardOs extends ForwardingOs { super(os); } - private FileDescriptor tagSocket(FileDescriptor fd) { + private FileDescriptor tagSocket(FileDescriptor fd) throws ErrnoException { try { BlockGuard.tagSocketFd(fd); return fd; diff --git a/luni/src/main/java/libcore/io/DiskLruCache.java b/luni/src/main/java/libcore/io/DiskLruCache.java index c887541..ecc1302 100644 --- a/luni/src/main/java/libcore/io/DiskLruCache.java +++ b/luni/src/main/java/libcore/io/DiskLruCache.java @@ -337,9 +337,9 @@ public final class DiskLruCache implements Closeable { private static void deleteIfExists(File file) throws IOException { try { Libcore.os.remove(file.getPath()); - } catch (ErrnoException e) { - if (e.errno != OsConstants.ENOENT) { - throw e; + } catch (ErrnoException errnoException) { + if (errnoException.errno != OsConstants.ENOENT) { + throw errnoException.rethrowAsIOException(); } } } @@ -801,4 +801,4 @@ public final class DiskLruCache implements Closeable { return new File(directory, key + "." + i + ".tmp"); } } -}
\ No newline at end of file +} diff --git a/luni/src/main/java/libcore/io/ErrnoException.java b/luni/src/main/java/libcore/io/ErrnoException.java index c1d95d9..9eec566 100644 --- a/luni/src/main/java/libcore/io/ErrnoException.java +++ b/luni/src/main/java/libcore/io/ErrnoException.java @@ -21,11 +21,11 @@ import java.net.SocketException; import libcore.io.OsConstants; /** - * An unchecked exception thrown when {@link Os} methods fail. This exception contains the native + * A checked exception thrown when {@link Os} methods fail. This exception contains the native * errno value, for comparison against the constants in {@link OsConstants}, should sophisticated * callers need to adjust their behavior based on the exact failure. */ -public final class ErrnoException extends RuntimeException { +public final class ErrnoException extends Exception { private final String functionName; public final int errno; diff --git a/luni/src/main/java/libcore/io/ForwardingOs.java b/luni/src/main/java/libcore/io/ForwardingOs.java index f205994..609beab 100644 --- a/luni/src/main/java/libcore/io/ForwardingOs.java +++ b/luni/src/main/java/libcore/io/ForwardingOs.java @@ -116,7 +116,7 @@ public class ForwardingOs implements Os { public String strerror(int errno) { return os.strerror(errno); } public void symlink(String oldPath, String newPath) throws ErrnoException { os.symlink(oldPath, newPath); } public long sysconf(int name) { return os.sysconf(name); } - public StructUtsname uname() throws ErrnoException { return os.uname(); } + public StructUtsname uname() { return os.uname(); } public int waitpid(int pid, MutableInt status, int options) throws ErrnoException { return os.waitpid(pid, status, options); } public int write(FileDescriptor fd, ByteBuffer buffer) throws ErrnoException { return os.write(fd, buffer); } public int write(FileDescriptor fd, byte[] bytes, int byteOffset, int byteCount) throws ErrnoException { return os.write(fd, bytes, byteOffset, byteCount); } diff --git a/luni/src/main/java/libcore/io/IoBridge.java b/luni/src/main/java/libcore/io/IoBridge.java index c26b565..b983097 100644 --- a/luni/src/main/java/libcore/io/IoBridge.java +++ b/luni/src/main/java/libcore/io/IoBridge.java @@ -124,7 +124,7 @@ public final class IoBridge { } } - private static boolean connectErrno(FileDescriptor fd, InetAddress inetAddress, int port, int timeoutMs) throws IOException { + private static boolean connectErrno(FileDescriptor fd, InetAddress inetAddress, int port, int timeoutMs) throws ErrnoException, IOException { // With no timeout, just call connect(2) directly. if (timeoutMs == 0) { Libcore.os.connect(fd, inetAddress, port); @@ -240,7 +240,7 @@ public final class IoBridge { } } - private static Object getSocketOptionErrno(FileDescriptor fd, int option) throws SocketException { + private static Object getSocketOptionErrno(FileDescriptor fd, int option) throws ErrnoException, SocketException { switch (option) { case SocketOptions.IP_MULTICAST_IF: // This is IPv4-only. @@ -307,7 +307,7 @@ public final class IoBridge { } } - private static void setSocketOptionErrno(FileDescriptor fd, int option, Object value) throws SocketException { + private static void setSocketOptionErrno(FileDescriptor fd, int option, Object value) throws ErrnoException, SocketException { switch (option) { case SocketOptions.IP_MULTICAST_IF: throw new UnsupportedOperationException("Use IP_MULTICAST_IF2 on Android"); @@ -579,15 +579,22 @@ public final class IoBridge { } public static InetAddress getSocketLocalAddress(FileDescriptor fd) { - SocketAddress sa = Libcore.os.getsockname(fd); - InetSocketAddress isa = (InetSocketAddress) sa; - return isa.getAddress(); + try { + SocketAddress sa = Libcore.os.getsockname(fd); + InetSocketAddress isa = (InetSocketAddress) sa; + return isa.getAddress(); + } catch (ErrnoException errnoException) { + throw new AssertionError(errnoException); + } } public static int getSocketLocalPort(FileDescriptor fd) { - SocketAddress sa = Libcore.os.getsockname(fd); - InetSocketAddress isa = (InetSocketAddress) sa; - return isa.getPort(); + try { + SocketAddress sa = Libcore.os.getsockname(fd); + InetSocketAddress isa = (InetSocketAddress) sa; + return isa.getPort(); + } catch (ErrnoException errnoException) { + throw new AssertionError(errnoException); + } } - } diff --git a/luni/src/main/java/libcore/io/IoUtils.java b/luni/src/main/java/libcore/io/IoUtils.java index 6680882..243d8d8 100644 --- a/luni/src/main/java/libcore/io/IoUtils.java +++ b/luni/src/main/java/libcore/io/IoUtils.java @@ -16,7 +16,6 @@ package libcore.io; -import java.io.Closeable; import java.io.File; import java.io.FileDescriptor; import java.io.IOException; @@ -44,13 +43,15 @@ public final class IoUtils { } /** - * Closes 'closeable', ignoring any exceptions. Does nothing if 'closeable' is null. + * Closes 'closeable', ignoring any checked exceptions. Does nothing if 'closeable' is null. */ - public static void closeQuietly(Closeable closeable) { + public static void closeQuietly(AutoCloseable closeable) { if (closeable != null) { try { closeable.close(); - } catch (IOException ignored) { + } catch (RuntimeException rethrown) { + throw rethrown; + } catch (Exception ignored) { } } } diff --git a/luni/src/main/java/libcore/io/MemoryMappedFile.java b/luni/src/main/java/libcore/io/MemoryMappedFile.java index f1fc027..1c106de 100644 --- a/luni/src/main/java/libcore/io/MemoryMappedFile.java +++ b/luni/src/main/java/libcore/io/MemoryMappedFile.java @@ -16,13 +16,13 @@ package libcore.io; -import java.io.Closeable; import java.io.FileDescriptor; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteOrder; import java.nio.NioUtils; import java.nio.channels.FileChannel; +import libcore.io.ErrnoException; import libcore.io.Libcore; import libcore.io.Memory; import static libcore.io.OsConstants.*; @@ -32,7 +32,7 @@ import static libcore.io.OsConstants.*; * and either {@link #bigEndianIterator} or {@link #littleEndianIterator} to get a seekable * {@link BufferIterator} over the mapped data. */ -public final class MemoryMappedFile implements Closeable { +public final class MemoryMappedFile implements AutoCloseable { private long address; private final long size; @@ -47,7 +47,7 @@ public final class MemoryMappedFile implements Closeable { /** * Use this to mmap the whole file read-only. */ - public static MemoryMappedFile mmapRO(String path) { + public static MemoryMappedFile mmapRO(String path) throws ErrnoException { FileDescriptor fd = Libcore.os.open(path, O_RDONLY, 0); long size = Libcore.os.fstat(fd).st_size; long address = Libcore.os.mmap(0L, size, PROT_READ, MAP_SHARED, fd, 0); @@ -63,7 +63,7 @@ public final class MemoryMappedFile implements Closeable { * Calling this method invalidates any iterators over this {@code MemoryMappedFile}. It is an * error to use such an iterator after calling {@code close}. */ - public synchronized void close() { + public synchronized void close() throws ErrnoException { if (address != 0) { Libcore.os.munmap(address, size); address = 0; diff --git a/luni/src/main/java/libcore/io/Os.java b/luni/src/main/java/libcore/io/Os.java index bd50998..07d1464 100644 --- a/luni/src/main/java/libcore/io/Os.java +++ b/luni/src/main/java/libcore/io/Os.java @@ -110,7 +110,7 @@ public interface Os { public String strerror(int errno); public void symlink(String oldPath, String newPath) throws ErrnoException; public long sysconf(int name); - public StructUtsname uname() throws ErrnoException; + public StructUtsname uname(); public int waitpid(int pid, MutableInt status, int options) throws ErrnoException; public int write(FileDescriptor fd, ByteBuffer buffer) throws ErrnoException; public int write(FileDescriptor fd, byte[] bytes, int byteOffset, int byteCount) throws ErrnoException; diff --git a/luni/src/main/java/libcore/io/Posix.java b/luni/src/main/java/libcore/io/Posix.java index f976209..d6cdd89 100644 --- a/luni/src/main/java/libcore/io/Posix.java +++ b/luni/src/main/java/libcore/io/Posix.java @@ -140,7 +140,7 @@ public final class Posix implements Os { public native String strerror(int errno); public native void symlink(String oldPath, String newPath) throws ErrnoException; public native long sysconf(int name); - public native StructUtsname uname() throws ErrnoException; + public native StructUtsname uname(); public native int waitpid(int pid, MutableInt status, int options) throws ErrnoException; public int write(FileDescriptor fd, ByteBuffer buffer) throws ErrnoException { if (buffer.isDirect()) { diff --git a/luni/src/main/java/libcore/util/ZoneInfoDB.java b/luni/src/main/java/libcore/util/ZoneInfoDB.java index 75dcafe..69b6784 100644 --- a/luni/src/main/java/libcore/util/ZoneInfoDB.java +++ b/luni/src/main/java/libcore/util/ZoneInfoDB.java @@ -27,6 +27,7 @@ import java.util.Arrays; import java.util.List; import java.util.TimeZone; import libcore.io.BufferIterator; +import libcore.io.ErrnoException; import libcore.io.IoUtils; import libcore.io.MemoryMappedFile; @@ -65,6 +66,15 @@ public final class ZoneInfoDB { private static final String VERSION = readVersion(); /** + * Rather than open, read, and close the big data file each time we look up a time zone, + * we map the big data file during startup, and then just use the MemoryMappedFile. + * + * At the moment, this "big" data file is about 500 KiB. At some point, that will be small + * enough that we'll just keep the byte[] in memory. + */ + private static final MemoryMappedFile ALL_ZONE_DATA = mapData(); + + /** * The 'ids' array contains time zone ids sorted alphabetically, for binary searching. * The other two arrays are in the same order. 'byteOffsets' gives the byte offset * into "zoneinfo.dat" of each time zone, and 'rawUtcOffsets' gives the time zone's @@ -77,16 +87,8 @@ public final class ZoneInfoDB { readIndex(); } - /** - * Rather than open, read, and close the big data file each time we look up a time zone, - * we map the big data file during startup, and then just use the MemoryMappedFile. - * - * At the moment, this "big" data file is about 500 KiB. At some point, that will be small - * enough that we'll just keep the byte[] in memory. - */ - private static final MemoryMappedFile allZoneData = MemoryMappedFile.mmapRO(ZONE_FILE_NAME); - - private ZoneInfoDB() {} + private ZoneInfoDB() { + } /** * Reads the file indicating the database version in use. @@ -100,6 +102,14 @@ public final class ZoneInfoDB { } } + private static MemoryMappedFile mapData() { + try { + return MemoryMappedFile.mmapRO(ZONE_FILE_NAME); + } catch (ErrnoException errnoException) { + throw new AssertionError(errnoException); + } + } + /** * Traditionally, Unix systems have one file per time zone. We have one big data file, which * is just a concatenation of regular time zone files. To allow random access into this big @@ -111,17 +121,18 @@ public final class ZoneInfoDB { * All this code assumes strings are US-ASCII. */ private static void readIndex() { - MemoryMappedFile mappedFile = MemoryMappedFile.mmapRO(INDEX_FILE_NAME); + MemoryMappedFile mappedFile = null; try { + mappedFile = MemoryMappedFile.mmapRO(INDEX_FILE_NAME); readIndex(mappedFile); - } catch (IOException ex) { - throw new RuntimeException(ex); + } catch (Exception ex) { + throw new AssertionError(ex); } finally { IoUtils.closeQuietly(mappedFile); } } - private static void readIndex(MemoryMappedFile mappedFile) throws IOException { + private static void readIndex(MemoryMappedFile mappedFile) throws ErrnoException, IOException { BufferIterator it = mappedFile.bigEndianIterator(); // The database reserves 40 bytes for each id. @@ -176,7 +187,7 @@ public final class ZoneInfoDB { return null; } - BufferIterator data = allZoneData.bigEndianIterator(); + BufferIterator data = ALL_ZONE_DATA.bigEndianIterator(); data.skip(byteOffsets[index]); // Variable names beginning tzh_ correspond to those in "tzfile.h". diff --git a/luni/src/main/native/libcore_io_Posix.cpp b/luni/src/main/native/libcore_io_Posix.cpp index 28d01f1..97a9399 100644 --- a/luni/src/main/native/libcore_io_Posix.cpp +++ b/luni/src/main/native/libcore_io_Posix.cpp @@ -1164,8 +1164,8 @@ static jlong Posix_sysconf(JNIEnv* env, jobject, jint name) { static jobject Posix_uname(JNIEnv* env, jobject) { struct utsname buf; - if (throwIfMinusOne(env, "uname", TEMP_FAILURE_RETRY(uname(&buf))) == -1) { - return NULL; + if (TEMP_FAILURE_RETRY(uname(&buf)) == -1) { + return NULL; // Can't happen. } return makeStructUtsname(env, buf); } diff --git a/luni/src/test/java/libcore/java/io/FileTest.java b/luni/src/test/java/libcore/java/io/FileTest.java index df55222..d59111d 100644 --- a/luni/src/test/java/libcore/java/io/FileTest.java +++ b/luni/src/test/java/libcore/java/io/FileTest.java @@ -182,11 +182,11 @@ public class FileTest extends junit.framework.TestCase { assertEquals(target.getCanonicalPath(), linkName.getCanonicalPath()); } - private static void ln_s(File target, File linkName) { + private static void ln_s(File target, File linkName) throws Exception { ln_s(target.toString(), linkName.toString()); } - private static void ln_s(String target, String linkName) { + private static void ln_s(String target, String linkName) throws Exception { Libcore.os.symlink(target, linkName); } |