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 | |
parent | 79564567f601d0f7187f9df4d8982f2ac6bc3c20 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | libjava/gnu/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 <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 * |