diff options
Diffstat (limited to 'libjava/gnu/java')
-rw-r--r-- | libjava/gnu/java/nio/channels/natFileChannelWin32.cc | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/libjava/gnu/java/nio/channels/natFileChannelWin32.cc b/libjava/gnu/java/nio/channels/natFileChannelWin32.cc index ca6387d..ab238e6 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 * |