lock/unlock filechannel Win32 implementation (patch file)
Marco Trudel
mtrudel@gmx.ch
Tue Nov 14 19:04:00 GMT 2006
Cool :-)
To commit it, we need copyright assignment from you. It's quite easy,
but someone has to send you the mail you need. Unfortunately I deleted
the one I once got...
Can anyone please send it to Martin?
thanks
Marco
Martin wrote:
> Tested, seems to work fine :)
>
> attached the diff patch!
>
> Martin
>
>
> ------------------------------------------------------------------------
>
> Index: gnu/java/nio/channels/natFileChannelWin32.cc
> ===================================================================
> --- gnu/java/nio/channels/natFileChannelWin32.cc (revision 117867)
> +++ gnu/java/nio/channels/natFileChannelWin32.cc (working copy)
> @@ -30,6 +30,7 @@
> #include <java/io/InterruptedIOException.h>
> #include <java/io/EOFException.h>
> #include <java/lang/ArrayIndexOutOfBoundsException.h>
> +#include <java/lang/IllegalArgumentException.h>
> #include <java/lang/NullPointerException.h>
> #include <java/lang/System.h>
> #include <java/lang/String.h>
> @@ -342,19 +343,87 @@
> return size() - position();
> }
>
> -jboolean
> -FileChannelImpl::lock
> -(jlong /*pos*/, jlong /*len*/, jboolean /*shared*/, jboolean /*wait*/)
> +jboolean FileChannelImpl::lock (jlong pos, jlong len, jboolean shared, jboolean wait)
> {
> - throw new IOException (JvNewStringLatin1
> - ("FileChannel.lock() not implemented"));
> + DWORD flags = 0;
> + OVERLAPPED ovlpd;
> +
> + if(pos<0 || len<0)
> + throw new ::java::lang::IllegalArgumentException
> + (JvNewStringLatin1("pos or len are negative!"));
> +
> + 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)
> + {
> + DWORD errnum = GetLastError();
> + LPTSTR perrmsg = NULL;
> +
> + if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
> + FORMAT_MESSAGE_FROM_SYSTEM,0,errnum,0,(LPTSTR)&perrmsg,0,NULL))
> + {
> + jstring jerrstr= JvNewStringLatin1(perrmsg);
> + LocalFree(perrmsg);
> + throw new IOException(jerrstr);
> + }
> + else
> + throw new IOException(JvNewStringLatin1("LockFileEx() failed!"));
> + }
> +
> + return true;
> }
>
> -void
> -FileChannelImpl::unlock (jlong /*pos*/, jlong /*len*/)
> +void FileChannelImpl::unlock (jlong pos, jlong len)
> {
> - throw new IOException (JvNewStringLatin1
> - ("FileChannel.unlock() not implemented"));
> + OVERLAPPED ovlpd;
> +
> + if(pos<0 || len<0)
> + throw new ::java::lang::IllegalArgumentException
> + (JvNewStringLatin1("pos or len are negative!"));
> +
> + 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)
> + {
> + DWORD errnum = GetLastError();
> + LPTSTR perrmsg = NULL;
> +
> + if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
> + FORMAT_MESSAGE_FROM_SYSTEM,0,errnum,0,(LPTSTR)&perrmsg,0,NULL))
> + {
> + jstring jerrstr= JvNewStringLatin1(perrmsg);
> + LocalFree(perrmsg);
> + throw new IOException(jerrstr);
> + }
> + else
> + throw new IOException(JvNewStringLatin1("UnlockFileEx() failed!"));
> + }
> }
>
> java::nio::MappedByteBuffer *
More information about the Java-patches
mailing list