OSDN Git Service

2007-01-28 Michele Sandri <gpointorama@gmail.com>
authormembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 28 Jan 2007 18:55:36 +0000 (18:55 +0000)
committermembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 28 Jan 2007 18:55:36 +0000 (18:55 +0000)
* 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

libjava/ChangeLog
libjava/gnu/java/nio/channels/natFileChannelWin32.cc

index 7aea265..9c1e951 100644 (file)
@@ -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
index ca6387d..ab238e6 100644 (file)
@@ -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 *