2007-01-28 Michele Sandri <gpointorama@gmail.com>
authorMichele Sandri <gpointorama@gmail.com>
Sun, 28 Jan 2007 18:55:36 +0000 (18:55 +0000)
committerMohan Embar <membar@gcc.gnu.org>
Sun, 28 Jan 2007 18:55:36 +0000 (18:55 +0000)
* gnu/java/nio/channels/natFileChannelWin32.cc
(lock): Implemented.
(unlock): Implemented.

From-SVN: r121265

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

index 7aea26537caa6a81357544c5b081923d586e860f..9c1e951069168d0e939d63acd8d3464b07796458 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 ca6387df0118ea6c881a4028af6eb063911813de..ab238e6234cd708fa2eef7711fd64390a755fd68 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 *