diff options
author | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-28 18:55:36 +0000 |
---|---|---|
committer | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-28 18:55:36 +0000 |
commit | 013eb60cf2d0ddefb8064b957526eb89ccce37ea (patch) | |
tree | 67e57e2a595b91e1231c3b6845cab068569b8f2b /libjava/gnu/java | |
parent | 79564567f601d0f7187f9df4d8982f2ac6bc3c20 (diff) | |
download | ppe42-gcc-013eb60cf2d0ddefb8064b957526eb89ccce37ea.tar.gz ppe42-gcc-013eb60cf2d0ddefb8064b957526eb89ccce37ea.zip |
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/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 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 * |