aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu
diff options
context:
space:
mode:
authorMichele Sandri <gpointorama@gmail.com>2007-01-28 18:55:36 +0000
committerMohan Embar <membar@gcc.gnu.org>2007-01-28 18:55:36 +0000
commit94468b1ceb267549a53101d1077368d17cf73bc6 (patch)
tree67e57e2a595b91e1231c3b6845cab068569b8f2b /libjava/gnu
parent226a2e08e50f39f910b847f04fb16ab2cac6d5e1 (diff)
downloadgcc-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')
-rw-r--r--libjava/gnu/java/nio/channels/natFileChannelWin32.cc48
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 *