aboutsummaryrefslogtreecommitdiff
path: root/libjava/java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/nio/channels/FileChannelImpl.java41
-rw-r--r--libjava/java/nio/channels/natFileChannelImpl.cc16
2 files changed, 53 insertions, 4 deletions
diff --git a/libjava/java/nio/channels/FileChannelImpl.java b/libjava/java/nio/channels/FileChannelImpl.java
index 89ac11a..ea2526e 100644
--- a/libjava/java/nio/channels/FileChannelImpl.java
+++ b/libjava/java/nio/channels/FileChannelImpl.java
@@ -38,6 +38,9 @@ exception statement from your version. */
package java.nio.channels;
+import gnu.classpath.Configuration;
+import gnu.gcj.RawData;
+import gnu.java.nio.FileLockImpl;
import java.io.EOFException;
import java.io.FileDescriptor;
import java.io.FileInputStream;
@@ -47,8 +50,6 @@ import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.MappedByteBufferImpl;
-import gnu.classpath.Configuration;
-import gnu.gcj.RawData;
/**
* This file is not user visible !
@@ -354,8 +355,22 @@ public class FileChannelImpl extends FileChannel
file_obj instanceof FileInputStream)
throw new NonWritableChannelException ();
- throw new Error ("Not implemented");
+ boolean completed = false;
+
+ try
+ {
+ begin();
+ lockImpl(position, size, shared);
+ completed = true;
+ return new FileLockImpl(fd, this, position, size, shared);
+ }
+ finally
+ {
+ end(completed);
+ }
}
+
+ private native void lockImpl(long position, long size, boolean shared);
public FileLock tryLock (long position, long size, boolean shared)
throws IOException
@@ -367,9 +382,27 @@ public class FileChannelImpl extends FileChannel
if (!isOpen ())
throw new ClosedChannelException ();
- throw new Error ("Not implemented");
+ if (! tryLockImpl(position, size, shared))
+ return null;
+
+ boolean completed = false;
+
+ try
+ {
+ boolean lockable = tryLockImpl(position, size, shared);
+ completed = true;
+ return (lockable
+ ? new FileLockImpl(fd, this, position, size, shared)
+ : null);
+ }
+ finally
+ {
+ end(completed);
+ }
}
+ private native boolean tryLockImpl(long position, long size, boolean shared);
+
public long position ()
throws IOException
{
diff --git a/libjava/java/nio/channels/natFileChannelImpl.cc b/libjava/java/nio/channels/natFileChannelImpl.cc
index 8dbbd14..56828a4 100644
--- a/libjava/java/nio/channels/natFileChannelImpl.cc
+++ b/libjava/java/nio/channels/natFileChannelImpl.cc
@@ -25,11 +25,13 @@ details. */
#endif
#include <gnu/gcj/RawData.h>
+#include <gnu/java/nio/FileLockImpl.h>
#include <java/io/FileDescriptor.h>
#include <java/io/IOException.h>
#include <java/nio/ByteBuffer.h>
#include <java/nio/channels/FileChannel.h>
#include <java/nio/channels/FileChannelImpl.h>
+#include <java/nio/channels/FileLock.h>
jlong
java::nio::channels::FileChannelImpl::size ()
@@ -92,3 +94,17 @@ java::nio::channels::FileChannelImpl::nio_msync (gnu::gcj::RawData* /*map_addres
{
throw new ::java::io::IOException (JvNewStringUTF ("msync not implemented"));
}
+
+void
+java::nio::channels::FileChannelImpl::lockImpl(jlong position, jlong size, jboolean shared)
+{
+ // FIXME: shared is unused, write is always true.
+ fd->lock(position, size, true);
+}
+
+jboolean
+java::nio::channels::FileChannelImpl::tryLockImpl(jlong position, jlong size, jboolean shared)
+{
+ // FIXME: shared is unused, write is always true.
+ return fd->tryLock(position, size, true);
+}