Hi all,
The apr_file_lock uses the LockFileEx API function to lock the file which is
unsupported on WIN9X platform, so as apr_file_unlock which uses
UnlockFileEx.
The solution is to check the OS version prior calling corresponding
function.
Since apr_file_lock uses only apr_file_t as function param, I've added
apr_oslevel_e type to the apr_file_t struct, and get it set during
apr_file_open. I've done that for the performance reason to avoid calling
GetOsVersion during each file lock/unlock.
***FILEIO.H:
--- fileio.h.old Wed Jun 27 21:40:54 2001
+++ fileio.h Mon Aug 13 12:24:46 2001
@@ -190,7 +190,7 @@
int direction; // buffer being used for 0 = read, 1 = write
apr_off_t filePtr; // position in file of handle
apr_lock_t *mutex; // mutex semaphore, must be owned to access
the above fields
-
+ apr_oslevel_e os_level;
/* Pipe specific info */
};
CUT!
OPEN.C:
--- open.c.old Tue Jul 31 19:37:46 2001
+++ open.c Mon Aug 13 12:24:32 2001
@@ -301,7 +301,7 @@
(*new)->dataRead = 0;
(*new)->direction = 0;
(*new)->filePtr = 0;
-
+ (*new)->os_level = os_level;
apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), file_cleanup,
apr_pool_cleanup_null);
return APR_SUCCESS;
CUT!
FLOCK.C:
--- flock.c.old Tue Aug 7 20:34:46 2001
+++ flock.c Mon Aug 13 12:38:04 2001
@@ -69,9 +69,15 @@
* recognize this as a try-again situation
*/
/* Syntax is correct, len is passed for LengthLow and LengthHigh*/
+ if (thefile->os_level >= APR_WIN_NT)
+ {
if (!LockFileEx(thefile->filehand, flags, 0, len, len, &offset))
return apr_get_os_error();
-
+ }
+ else {
+ if (!LockFile(thefile->filehand, 0, 0, len, 0))
+ return apr_get_os_error();
+ }
return APR_SUCCESS;
}
@@ -82,8 +88,14 @@
memset (&offset, 0, sizeof(offset));
/* Syntax is correct, len is passed for LengthLow and LengthHigh*/
+ if (thefile->os_level >= APR_WIN_NT)
+ {
if (!UnlockFileEx(thefile->filehand, 0, len, len, &offset))
return apr_get_os_error();
-
+ }
+ else {
+ if (!UnlockFile(thefile->filehand, 0, 0, len, 0))
+ return apr_get_os_error();
+ }
return APR_SUCCESS;
}
CUT!
MT.