diff options
author | Michele Sandri <gpointorama@gmail.com> | 2007-01-28 18:55:36 +0000 |
---|---|---|
committer | Mohan Embar <membar@gcc.gnu.org> | 2007-01-28 18:55:36 +0000 |
commit | 94468b1ceb267549a53101d1077368d17cf73bc6 (patch) | |
tree | 67e57e2a595b91e1231c3b6845cab068569b8f2b /libjava/gnu/java/nio/channels | |
parent | 226a2e08e50f39f910b847f04fb16ab2cac6d5e1 (diff) | |
download | gcc-94468b1ceb267549a53101d1077368d17cf73bc6.zip gcc-94468b1ceb267549a53101d1077368d17cf73bc6.tar.gz gcc-94468b1ceb267549a53101d1077368d17cf73bc6.tar.bz2 |
2007-01-28 Michele Sandri <gpointorama@gmail.com>
* gnu/java/nio/channels/natFileChannelWin32.cc
(lock): Implemented.
(unlock): Implemented.
From-SVN: r121265
Diffstat (limited to 'libjava/gnu/java/nio/channels')
-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 * |