-1 on putting os_level in the apr_file_t. The call to apr_get_oslevel is cheap. We make the Win32 system call only once. The result is saved in a static variable that is retrieved on subsequent calls to apr_get_oslevel. Committing a change to use *LockFile rather than *LockFileEx on Win 9x.
Bill ----- Original Message ----- From: "Mladen Turk" <[EMAIL PROTECTED]> To: "APR Dev List" <[email protected]> Sent: Monday, August 13, 2001 7:24 AM Subject: [PATCH] apr_file_lock/unclock on WIN9X > 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. >
