summaryrefslogtreecommitdiffstats
path: root/libjava/gnu/java/nio/FileChannelImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/gnu/java/nio/FileChannelImpl.java')
-rw-r--r--libjava/gnu/java/nio/FileChannelImpl.java70
1 files changed, 38 insertions, 32 deletions
diff --git a/libjava/gnu/java/nio/FileChannelImpl.java b/libjava/gnu/java/nio/FileChannelImpl.java
index 22835401816..c233d8210a7 100644
--- a/libjava/gnu/java/nio/FileChannelImpl.java
+++ b/libjava/gnu/java/nio/FileChannelImpl.java
@@ -52,6 +52,7 @@ import java.nio.channels.NonReadableChannelException;
import java.nio.channels.NonWritableChannelException;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
+import gnu.gcj.RawData;
/**
* This file is not user visible !
@@ -63,11 +64,14 @@ import java.nio.channels.WritableByteChannel;
public class FileChannelImpl extends FileChannel
{
- public long address;
- public int length;
- public FileDescriptor fd;
- public MappedByteBuffer buf;
- public Object file_obj; // just to keep it live...
+ // GCJ LOCAL: This variable stores a pointer to the memory
+ // where the file is mapped.
+ RawData map_address;
+
+ int length;
+ FileDescriptor fd;
+ MappedByteBuffer buf;
+ Object file_obj; // just to keep it live...
public FileChannelImpl (FileDescriptor fd, boolean write, Object obj)
{
@@ -80,24 +84,27 @@ public class FileChannelImpl extends FileChannel
this.file_obj = obj;
}
+ public FileChannelImpl ()
+ {
+ this (new FileDescriptor (-1), true, null);
+ }
+
private native long implPosition ();
private native FileChannel implPosition (long newPosition);
private native FileChannel implTruncate (long size);
- private native long nio_mmap_file (long pos, long size, int mode);
- private native void nio_unmmap_file (long address, int size);
- private native void nio_msync (long address, int length);
+ private native RawData nio_mmap_file (long pos, long size, int mode);
+ private native void nio_unmmap_file (RawData map_address, int size);
+ private native void nio_msync (RawData map_address, int length);
public native long size () throws IOException;
protected void implCloseChannel() throws IOException
{
- // FIXME
-
- if (address != 0)
+ if (map_address != null)
{
- //nio_unmmap_file (fd, address, (int) length);
- address = 0;
+ nio_unmmap_file (map_address, (int) length);
+ map_address = null;
}
if (file_obj instanceof RandomAccessFile)
@@ -126,9 +133,9 @@ public class FileChannelImpl extends FileChannel
throw new EOFException("file not mapped");
}
- for (int i=0; i<s; i++)
+ for (int i = 0; i < s; i++)
{
- dst.put( buf.get() );
+ dst.put (buf.get());
}
return s;
@@ -154,9 +161,9 @@ public class FileChannelImpl extends FileChannel
long result = 0;
for (int i = offset; i < offset + length; i++)
- {
- result += write (dsts[i]);
- }
+ {
+ result += write (dsts [i]);
+ }
return result;
}
@@ -218,23 +225,22 @@ public class FileChannelImpl extends FileChannel
|| size > Integer.MAX_VALUE)
throw new IllegalArgumentException ();
-// int cmode = mode.m;
-// address = nio_mmap_file (fd, position, size, cmode);
-// length = size;
-// buf = new MappedByteFileBuffer (this);
-// return buf;
- return null;
+ int cmode = mode.m;
+ map_address = nio_mmap_file (position, size, cmode);
+ length = (int) size;
+ buf = new MappedByteFileBuffer (this);
+ return buf;
}
- static MappedByteBuffer create_direct_mapped_buffer (long address,
+ static MappedByteBuffer create_direct_mapped_buffer (RawData map_address,
long length)
+ throws IOException
{
-// FileChannelImpl ch = new FileChannelImpl (-1, null);
-// ch.address = address;
-// ch.length = (int) length;
-// ch.buf = new MappedByteFileBuffer (ch);
-// return ch.buf;
- return null;
+ FileChannelImpl ch = new FileChannelImpl ();
+ ch.map_address = map_address;
+ ch.length = (int) length;
+ ch.buf = new MappedByteFileBuffer (ch);
+ return ch.buf;
}
public long write (ByteBuffer[] srcs)
@@ -253,7 +259,7 @@ public class FileChannelImpl extends FileChannel
// FIXME: What to do with metaData ?
- nio_msync (address, length);
+ nio_msync (map_address, length);
}
public long transferTo (long position, long count, WritableByteChannel target)
OpenPOWER on IntegriCloud