aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog18
-rw-r--r--libjava/gnu/java/nio/FileLockImpl.java18
-rw-r--r--libjava/gnu/java/nio/natFileLockImpl.cc3
-rw-r--r--libjava/java/nio/channels/FileChannelImpl.java41
-rw-r--r--libjava/java/nio/channels/natFileChannelImpl.cc16
5 files changed, 86 insertions, 10 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 1d25820..578a308d 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,5 +1,23 @@
2004-01-23 Michael Koch <konqueror@gmx.de>
+ * gnu/java/nio/FileLockImpl.java:
+ Fixed filename in copyright.
+ (released): Removed.
+ (finalize): New method.
+ * gnu/java/nio/natFileLockImpl.cc
+ (releaseImpl): Implemented.
+ * java/nio/channels/FileChannelImpl.java:
+ Reworked imports.
+ (lock): Implemented.
+ (lockImpl): New method.
+ (tryLock): Implemented.
+ (tryLockImpl): New method.
+ * java/nio/channels/natFileChannelImpl.cc
+ (lockImpl): New method.
+ (tryLockImpl): New method.
+
+2004-01-23 Michael Koch <konqueror@gmx.de>
+
* java/io/FileDescriptor.java
(lock): New method.
(tryLock): New method.
diff --git a/libjava/gnu/java/nio/FileLockImpl.java b/libjava/gnu/java/nio/FileLockImpl.java
index f85d60a..b621bd2 100644
--- a/libjava/gnu/java/nio/FileLockImpl.java
+++ b/libjava/gnu/java/nio/FileLockImpl.java
@@ -1,5 +1,5 @@
-/* FileChannelImpl.java --
- Copyright (C) 2002 Free Software Foundation, Inc.
+/* FileLockImpl.java --
+ Copyright (C) 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -60,14 +60,24 @@ public class FileLockImpl extends FileLock
}
private FileDescriptor fd;
- private boolean released;
public FileLockImpl (FileDescriptor fd, FileChannel channel, long position,
long size, boolean shared)
{
super (channel, position, size, shared);
this.fd = fd;
- this.released = false;
+ }
+
+ public void finalize()
+ {
+ try
+ {
+ release();
+ }
+ catch (IOException e)
+ {
+ // Ignore this.
+ }
}
public boolean isValid ()
diff --git a/libjava/gnu/java/nio/natFileLockImpl.cc b/libjava/gnu/java/nio/natFileLockImpl.cc
index 19a3b83..d3d01a1 100644
--- a/libjava/gnu/java/nio/natFileLockImpl.cc
+++ b/libjava/gnu/java/nio/natFileLockImpl.cc
@@ -20,6 +20,5 @@ details. */
void
gnu::java::nio::FileLockImpl::releaseImpl ()
{
- throw new ::java::io::IOException
- (JvNewStringUTF ("releaseImpl not implemented"));
+ fd->unlock(position(), size());
}
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);
+}