summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2008-10-06 11:47:39 +0000
committerXavier Leroy <xavier.leroy@inria.fr>2008-10-06 11:47:39 +0000
commit2ea9e887af4da43138dedc5e34a08157df9fbbd8 (patch)
tree04e05fbe6493b47c72fa029957c3de599e3a0b92
parent35205da90c1ec12ae194c27b7d5598af76dcfa59 (diff)
Fixed error handling. Added credit.
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@9069 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--otherlibs/win32unix/lockf.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/otherlibs/win32unix/lockf.c b/otherlibs/win32unix/lockf.c
index 431b0ee6a..662b03206 100644
--- a/otherlibs/win32unix/lockf.c
+++ b/otherlibs/win32unix/lockf.c
@@ -51,7 +51,6 @@ static void set_file_pointer(HANDLE h, LARGE_INTEGER gohere,
CAMLprim value unix_lockf(value fd, value cmd, value span)
{
CAMLparam3(fd, cmd, span);
- int lock_ret;
OVERLAPPED overlap;
intnat l_len;
HANDLE h;
@@ -60,6 +59,7 @@ CAMLprim value unix_lockf(value fd, value cmd, value span)
LARGE_INTEGER beg_position;
LARGE_INTEGER lock_len;
LARGE_INTEGER zero;
+ DWORD err = NO_ERROR;
version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(GetVersionEx(&version) == 0) {
@@ -106,18 +106,21 @@ CAMLprim value unix_lockf(value fd, value cmd, value span)
switch(Int_val(cmd)) {
case 0: /* F_ULOCK - unlock */
- lock_ret = UnlockFileEx(h, 0,
- lock_len.LowPart, lock_len.HighPart, &overlap);
+ if (! UnlockFileEx(h, 0,
+ lock_len.LowPart, lock_len.HighPart, &overlap))
+ err = GetLastError();
break;
case 1: /* F_LOCK - blocking write lock */
enter_blocking_section();
- lock_ret = LockFileEx(h, LOCKFILE_EXCLUSIVE_LOCK, 0,
- lock_len.LowPart, lock_len.HighPart, &overlap);
+ if (! LockFileEx(h, LOCKFILE_EXCLUSIVE_LOCK, 0,
+ lock_len.LowPart, lock_len.HighPart, &overlap))
+ err = GetLastError();
leave_blocking_section();
break;
case 2: /* F_TLOCK - non-blocking write lock */
- lock_ret = LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, 0,
- lock_len.LowPart, lock_len.HighPart, &overlap);
+ if (! LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, 0,
+ lock_len.LowPart, lock_len.HighPart, &overlap))
+ err = GetLastError();
break;
case 3: /* F_TEST - check whether a write lock can be obtained */
/* I'm doing this by aquiring an immediate write
@@ -125,28 +128,31 @@ CAMLprim value unix_lockf(value fd, value cmd, value span)
* this behavior matches anything in particular, but
* it is not clear the nature of the lock test performed
* by ocaml (unix) currently. */
- lock_ret = LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, 0,
- lock_len.LowPart, lock_len.HighPart, &overlap);
- if (lock_ret != 0) {
+ if (LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, 0,
+ lock_len.LowPart, lock_len.HighPart, &overlap)) {
UnlockFileEx(h, 0, lock_len.LowPart, lock_len.HighPart, &overlap);
+ } else {
+ err = GetLastError();
}
break;
case 4: /* F_RLOCK - blocking read lock */
enter_blocking_section();
- lock_ret = LockFileEx(h, 0, 0,
- lock_len.LowPart, lock_len.HighPart, &overlap);
+ if (! LockFileEx(h, 0, 0,
+ lock_len.LowPart, lock_len.HighPart, &overlap))
+ err = GetLastError();
leave_blocking_section();
break;
case 5: /* F_TRLOCK - non-blocking read lock */
- lock_ret = LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY, 0,
- lock_len.LowPart, lock_len.HighPart, &overlap);
+ if (! LockFileEx(h, LOCKFILE_FAIL_IMMEDIATELY, 0,
+ lock_len.LowPart, lock_len.HighPart, &overlap))
+ err = GetLastError();
break;
default:
errno = EINVAL;
uerror("lockf", Nothing);
}
- if (lock_ret == 0) {
- win32_maperr(GetLastError());
+ if (err != NO_ERROR) {
+ win32_maperr(err);
uerror("lockf", Nothing);
}
CAMLreturn(Val_unit);