From 94468b1ceb267549a53101d1077368d17cf73bc6 Mon Sep 17 00:00:00 2001 From: Michele Sandri Date: Sun, 28 Jan 2007 18:55:36 +0000 Subject: [PATCH] 2007-01-28 Michele Sandri * gnu/java/nio/channels/natFileChannelWin32.cc (lock): Implemented. (unlock): Implemented. From-SVN: r121265 --- libjava/ChangeLog | 6 +++ .../java/nio/channels/natFileChannelWin32.cc | 48 ++++++++++++++++--- 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 + + * gnu/java/nio/channels/natFileChannelWin32.cc + (lock): Implemented. + (unlock): Implemented. + 2007-01-27 Andreas Tobler 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 * -- 2.30.2