This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: java.io.FileDescriptor
- From: Michael Koch <konqueror at gmx dot de>
- To: java-patches at gcc dot gnu dot org
- Date: Tue, 6 Jan 2004 14:02:48 +0100
- Subject: Patch: java.io.FileDescriptor
Hi list,
I wrote a little patch to add the possibility to lock file regions with
FileDescriptor. Currently only POSIX version is implemented (hopefully it
compiles everywhere).
Please review and comment. Okay to commit ?
Michael
2004-01-06 Michael Koch <konqueror@gmx.de>
* java/io/FileDescriptor.java
(lock): New method.
(tryLock): New method.
(unlock): New method.
* java/io/natFileDescriptorEcos.cc
(lock): New method.
(tryLock): New method.
(unlock): New method.
* java/io/natFileDescriptorPosix.cc
(lock): New method.
(tryLock): New method.
(unlock): New method.
* java/io/natFileDescriptorWin32.cc
(lock): New method.
(tryLock): New method.
(unlock): New method.
Index: java/io/FileDescriptor.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/FileDescriptor.java,v
retrieving revision 1.13
diff -u -b -B -r1.13 FileDescriptor.java
--- java/io/FileDescriptor.java 13 May 2003 09:13:31 -0000 1.13
+++ java/io/FileDescriptor.java 6 Jan 2004 12:57:33 -0000
@@ -78,6 +78,9 @@
native int read () throws IOException;
native int read (byte[] bytes, int offset, int len) throws IOException;
native int available () throws IOException;
+ native void lock(long pos, int len, boolean shared) throws IOException;
+ native boolean tryLock(long pos, int len, boolean shared) throws IOException;
+ native void unlock(long pos, int len) throws IOException;
// When collected, close.
Index: java/io/natFileDescriptorEcos.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/natFileDescriptorEcos.cc,v
retrieving revision 1.10
diff -u -b -B -r1.10 natFileDescriptorEcos.cc
--- java/io/natFileDescriptorEcos.cc 13 May 2003 09:13:31 -0000 1.10
+++ java/io/natFileDescriptorEcos.cc 6 Jan 2004 12:57:33 -0000
@@ -136,3 +136,24 @@
{
return 0;
}
+
+void
+java::io::FileDescriptor::lock (jlong pos, jint len, jboolean shared)
+{
+ throw new IOException (JvNewStringLatin1
+ ("java.io.FileDescriptor.lock() not implemented"));
+}
+
+jboolean
+java::io::FileDescriptor::tryLock (jlong pos, jint len, jboolean shared)
+{
+ throw new IOException (JvNewStringLatin1
+ ("java.io.FileDescriptor.tryLock() not implemented"));
+}
+
+void
+java::io::FileDescriptor::unlock (jlong pos, jint len)
+{
+ throw new IOException (JvNewStringLatin1
+ ("java.io.FileDescriptor.unlock() not implemented"));
+}
Index: java/io/natFileDescriptorPosix.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/natFileDescriptorPosix.cc,v
retrieving revision 1.29
diff -u -b -B -r1.29 natFileDescriptorPosix.cc
--- java/io/natFileDescriptorPosix.cc 26 Jul 2003 00:40:50 -0000 1.29
+++ java/io/natFileDescriptorPosix.cc 6 Jan 2004 12:57:33 -0000
@@ -13,6 +13,7 @@
#include "posix.h"
#include <errno.h>
+#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
@@ -419,4 +420,48 @@
#else
return 0;
#endif
+}
+
+void
+java::io::FileDescriptor::lock (jlong pos, jint len, jboolean shared)
+{
+ struct flock lockdata;
+
+ lockdata.l_type = shared ? F_WRLCK : F_RDLCK;
+ lockdata.l_whence = SEEK_SET;
+ lockdata.l_start = pos;
+ lockdata.l_len = len;
+
+ if (::fcntl (fd, F_SETLK, &lockdata) == -1)
+ throw new IOException (JvNewStringLatin1 (strerror (errno)));
+}
+
+jboolean
+java::io::FileDescriptor::tryLock (jlong pos, jint len, jboolean shared)
+{
+ struct flock lockdata;
+
+ lockdata.l_type = shared ? F_WRLCK : F_RDLCK;
+ lockdata.l_whence = SEEK_SET;
+ lockdata.l_start = pos;
+ lockdata.l_len = len;
+
+ if (::fcntl (fd, F_GETLK, &lockdata) == -1)
+ throw new IOException (JvNewStringLatin1 (strerror (errno)));
+
+ return lockdata.l_type == F_UNLCK;
+}
+
+void
+java::io::FileDescriptor::unlock (jlong pos, jint len)
+{
+ struct flock lockdata;
+
+ lockdata.l_type = F_UNLCK;
+ lockdata.l_whence = SEEK_SET;
+ lockdata.l_start = pos;
+ lockdata.l_len = len;
+
+ if (::fcntl (fd, F_SETLK, &lockdata) == -1)
+ throw new IOException (JvNewStringLatin1 (strerror (errno)));
}
Index: java/io/natFileDescriptorWin32.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/natFileDescriptorWin32.cc,v
retrieving revision 1.17
diff -u -b -B -r1.17 natFileDescriptorWin32.cc
--- java/io/natFileDescriptorWin32.cc 2 Dec 2003 22:26:49 -0000 1.17
+++ java/io/natFileDescriptorWin32.cc 6 Jan 2004 12:57:33 -0000
@@ -350,3 +350,24 @@
// FIXME:
return getLength() - getFilePointer();
}
+
+void
+java::io::FileDescriptor::lock (jlong pos, jint len, jboolean shared)
+{
+ throw new IOException (JvNewStringLatin1
+ ("java.io.FileDescriptor.lock() not implemented"));
+}
+
+jboolean
+java::io::FileDescriptor::tryLock (jlong pos, jint len, jboolean shared)
+{
+ throw new IOException (JvNewStringLatin1
+ ("java.io.FileDescriptor.tryLock() not implemented"));
+}
+
+void
+java::io::FileDescriptor::unlock (jlong pos, jint len)
+{
+ throw new IOException (JvNewStringLatin1
+ ("java.io.FileDescriptor.unlock() not implemented"));
+}