summaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authormembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-28 18:55:36 +0000
committermembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-28 18:55:36 +0000
commit013eb60cf2d0ddefb8064b957526eb89ccce37ea (patch)
tree67e57e2a595b91e1231c3b6845cab068569b8f2b /libjava
parent79564567f601d0f7187f9df4d8982f2ac6bc3c20 (diff)
downloadgcc-013eb60cf2d0ddefb8064b957526eb89ccce37ea.tar.gz
2007-01-28 Michele Sandri <gpointorama@gmail.com>
* gnu/java/nio/channels/natFileChannelWin32.cc (lock): Implemented. (unlock): Implemented. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121265 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog6
-rw-r--r--libjava/gnu/java/nio/channels/natFileChannelWin32.cc48
2 files changed, 47 insertions, 7 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 7aea26537ca..9c1e9510691 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,9 @@
+2007-01-28 Michele Sandri <gpointorama@gmail.com>
+
+ * gnu/java/nio/channels/natFileChannelWin32.cc
+ (lock): Implemented.
+ (unlock): Implemented.
+
2007-01-27 Andreas Tobler <a.tobler@schweiz.org>
PR libgcj/30513
diff --git a/libjava/gnu/java/nio/channels/natFileChannelWin32.cc b/libjava/gnu/java/nio/channels/natFileChannelWin32.cc
index ca6387df011..ab238e6234c 100644
--- a/libjava/gnu/java/nio/channels/natFileChannelWin32.cc
+++ b/libjava/gnu/java/nio/channels/natFileChannelWin32.cc
@@ -343,18 +343,52 @@ FileChannelImpl::available (void)
}
jboolean
-FileChannelImpl::lock
-(jlong /*pos*/, jlong /*len*/, jboolean /*shared*/, jboolean /*wait*/)
+FileChannelImpl::lock (jlong pos, jlong len, jboolean shared, jboolean wait)
{
- throw new IOException (JvNewStringLatin1
- ("FileChannel.lock() not implemented"));
+ DWORD flags = 0;
+ OVERLAPPED ovlpd;
+
+ ZeroMemory(&ovlpd,sizeof(OVERLAPPED));
+
+ if(!shared)
+ flags |= LOCKFILE_EXCLUSIVE_LOCK;
+ if(!wait)
+ flags |= LOCKFILE_FAIL_IMMEDIATELY;
+
+ ovlpd.Offset = (DWORD)pos;
+ ovlpd.OffsetHigh = pos>>32;
+
+ DWORD lenlow = (DWORD)len;
+ DWORD lenhigh = len>>32;
+
+ BOOL ret = LockFileEx((HANDLE)fd,flags,0,lenlow,lenhigh,&ovlpd);
+
+ if(ret==ERROR_IO_PENDING && !shared && wait)
+ ret = GetOverlappedResult((HANDLE)fd,&ovlpd,NULL,wait);
+
+ if(!ret)
+ _Jv_ThrowIOException(GetLastError());
+
+ return true;
}
void
-FileChannelImpl::unlock (jlong /*pos*/, jlong /*len*/)
+FileChannelImpl::unlock (jlong pos, jlong len)
{
- throw new IOException (JvNewStringLatin1
- ("FileChannel.unlock() not implemented"));
+ OVERLAPPED ovlpd;
+
+ ZeroMemory(&ovlpd,sizeof(OVERLAPPED));
+
+ ovlpd.Offset = (DWORD)pos;
+ ovlpd.OffsetHigh = pos>>32;
+
+ DWORD lenlow = (DWORD)len;
+ DWORD lenhigh = len>>32;
+
+ BOOL ret = UnlockFileEx((HANDLE)fd,0,lenlow,lenhigh,&ovlpd);
+
+ if(!ret)
+ _Jv_ThrowIOException(GetLastError());
}
java::nio::MappedByteBuffer *