X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2Futil%2FSeekable.java;h=2bb195e3e3ae64893b93d9562a74b854d988aba1;hp=cacca0a3b9a700b28034c3522d76833b463f1820;hb=b11e7c6c29f2b5f7b0828bf93eb741c4a30ec411;hpb=6d6d9f59a2e6fe3b9e5b3563efcf0124bea4a672 diff --git a/src/org/ibex/nestedvm/util/Seekable.java b/src/org/ibex/nestedvm/util/Seekable.java index cacca0a..2bb195e 100644 --- a/src/org/ibex/nestedvm/util/Seekable.java +++ b/src/org/ibex/nestedvm/util/Seekable.java @@ -1,5 +1,5 @@ // Copyright 2000-2005 the Contributors, as shown in the revision logs. -// Licensed under the Apache Public Source License 2.0 ("the License"). +// Licensed under the Apache License 2.0 ("the License"). // You may not use this file except in compliance with the License. package org.ibex.nestedvm.util; @@ -14,9 +14,16 @@ public abstract class Seekable { public abstract void close() throws IOException; public abstract int pos() throws IOException; + public void sync() throws IOException { + throw new IOException("sync not implemented for " + getClass()); + } public void resize(long length) throws IOException { throw new IOException("resize not implemented for " + getClass()); } + /** If pos == 0 and size == 0 lock covers whole file. */ + public Lock lock(long pos, long size, boolean shared) throws IOException { + throw new IOException("lock not implemented for " + getClass()); + } public int read() throws IOException { byte[] buf = new byte[1]; @@ -71,23 +78,35 @@ public abstract class Seekable { } public static class File extends Seekable { + private final java.io.File file; private final RandomAccessFile raf; public File(String fileName) throws IOException { this(fileName,false); } public File(String fileName, boolean writable) throws IOException { this(new java.io.File(fileName),writable,false); } public File(java.io.File file, boolean writable, boolean truncate) throws IOException { + this.file = file; String mode = writable ? "rw" : "r"; - raf = truncate ? Platform.truncatedRandomAccessFile(file,mode) : new RandomAccessFile(file,mode); + raf = new RandomAccessFile(file,mode); + if (truncate) Platform.setFileLength(raf, 0); } public int read(byte[] buf, int offset, int length) throws IOException { return raf.read(buf,offset,length); } public int write(byte[] buf, int offset, int length) throws IOException { raf.write(buf,offset,length); return length; } + public void sync() throws IOException { raf.getFD().sync(); } public void seek(int pos) throws IOException{ raf.seek(pos); } public int pos() throws IOException { return (int) raf.getFilePointer(); } public int length() throws IOException { return (int)raf.length(); } public void close() throws IOException { raf.close(); } - public void resize(long length) throws IOException { raf.setLength(length); } + public void resize(long length) throws IOException { Platform.setFileLength(raf, (int)length); } + public boolean equals(Object o) { + return o != null && o instanceof File + && file.equals(((File)o).file); + } + public Lock lock(long pos, long size, boolean shared) + throws IOException { + return Platform.lockFile(this, raf, pos, size, shared); + } } public static class InputStream extends Seekable { @@ -135,4 +154,29 @@ public abstract class Seekable { public void close() throws IOException { is.close(); } } + public abstract static class Lock { + private Object owner = null; + + public abstract Seekable seekable(); + public abstract boolean isShared(); + public abstract boolean isValid(); + public abstract void release() throws IOException; + public abstract long position(); + public abstract long size(); + + public void setOwner(Object o) { owner = o; } + public Object getOwner() { return owner; } + + public final boolean contains(int start, int len) { + return start >= position() && position() + size() >= start + len; + } + + public final boolean contained(int start, int len) { + return start < position() && position() + size() < start + len; + } + + public final boolean overlaps(int start, int len) { + return contains(start, len) || contained(start, len); + } + } }