summaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog6
-rw-r--r--libjava/gnu/java/nio/channels/natFileChannelWin32.cc48
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 *