doc clarifications and tests for some file-locking corners
This commit is contained in:
parent
4c59f02cb0
commit
376efea754
|
@ -317,10 +317,31 @@ either it is released with @racket[port-file-unlock] or the port is closed
|
||||||
Depending on the platform, locks may be merely advisory (i.e., locks
|
Depending on the platform, locks may be merely advisory (i.e., locks
|
||||||
affect only the ability of processes to acquire locks) or they may
|
affect only the ability of processes to acquire locks) or they may
|
||||||
correspond to mandatory locks that prevent reads and writes to the
|
correspond to mandatory locks that prevent reads and writes to the
|
||||||
locked file. Specifically, locks are mandatory on Windows and
|
locked file. Specifically, locks are mandatory on Windows and advisory
|
||||||
advisory on other platforms.
|
on other platforms. Multiple tries for a @racket['shared] lock on a
|
||||||
|
single port can succeed; on Unix and Mac OS X, a single
|
||||||
|
@racket[port-file-unlock] release the lock, while on other Windows, a
|
||||||
|
@racket[port-file-unlock] is needed for each successful
|
||||||
|
@racket[port-try-file-lock?]. On Unix and Mac OS X, multiple tries for
|
||||||
|
a @racket['exclusive] lock can succeed and a single
|
||||||
|
@racket[port-file-unlock] releases the lock, while on Windows, a try
|
||||||
|
for an @racket['exclusive] lock fails for a given port if the port
|
||||||
|
already holds the lock.
|
||||||
|
|
||||||
Typically, locking is supported only for file ports, and attempting to
|
A lock acquired for an input port from @racket[open-input-output-file]
|
||||||
|
can be released through @racket[port-file-unlock] on the corresponding
|
||||||
|
output port, and vice versa. If the output port from
|
||||||
|
@racket[open-input-output-file] holds an @racket['exclusive] lock, the
|
||||||
|
corresponding input port can still acquire a @racket['shared] lock,
|
||||||
|
even multiple times; on Windows, a @racket[port-file-unlock] is needed
|
||||||
|
for each successful lock try, while a single @racket[port-file-unlock]
|
||||||
|
balances the lock tries on Unix and Mac OS X. A @racket['shared] lock on
|
||||||
|
an input port can be upgraded to an @racket['exclusive] lock through the
|
||||||
|
corresponding output port on Unix and Mac OS X, in which case a single
|
||||||
|
@racket[port-file-unlock] (on either port) releases the lock, while
|
||||||
|
such upgrades are not allowed on Windows.
|
||||||
|
|
||||||
|
Locking is normally supported only for file ports, and attempting to
|
||||||
acquire a lock with other kinds of file-stream ports raises an
|
acquire a lock with other kinds of file-stream ports raises an
|
||||||
@racket[exn:fail:filesystem] exception.}
|
@racket[exn:fail:filesystem] exception.}
|
||||||
|
|
||||||
|
|
|
@ -695,6 +695,7 @@
|
||||||
(check-test-file "tmp2")
|
(check-test-file "tmp2")
|
||||||
|
|
||||||
(let-values ([(p p-out) (open-input-output-file "tmp2" #:exists 'update)])
|
(let-values ([(p p-out) (open-input-output-file "tmp2" #:exists 'update)])
|
||||||
|
(test #t port-try-file-lock? p 'shared)
|
||||||
(test #t port-try-file-lock? p 'shared)
|
(test #t port-try-file-lock? p 'shared)
|
||||||
(let ([p2 (open-input-file "tmp2")])
|
(let ([p2 (open-input-file "tmp2")])
|
||||||
(test #t port-try-file-lock? p2 'shared)
|
(test #t port-try-file-lock? p2 'shared)
|
||||||
|
@ -704,8 +705,12 @@
|
||||||
(let ([p3 (open-output-file "tmp2" #:exists 'update)])
|
(let ([p3 (open-output-file "tmp2" #:exists 'update)])
|
||||||
(test #f port-try-file-lock? p3 'exclusive)
|
(test #f port-try-file-lock? p3 'exclusive)
|
||||||
(test (void) port-file-unlock p)
|
(test (void) port-file-unlock p)
|
||||||
|
(when (eq? (system-type) 'windows)
|
||||||
|
;; need another unlock, since we got a 'shared lock twice
|
||||||
|
(test #f port-try-file-lock? p3 'exclusive)
|
||||||
|
(test (void) port-file-unlock p))
|
||||||
(test #t port-try-file-lock? p3 'exclusive)
|
(test #t port-try-file-lock? p3 'exclusive)
|
||||||
(test #t port-try-file-lock? p3 'exclusive)
|
(test (not (eq? 'windows (system-type))) port-try-file-lock? p3 'exclusive)
|
||||||
(test #f port-try-file-lock? p 'shared)
|
(test #f port-try-file-lock? p 'shared)
|
||||||
(close-output-port p3))
|
(close-output-port p3))
|
||||||
(err/rt-test (port-try-file-lock? p 'exclusive))
|
(err/rt-test (port-try-file-lock? p 'exclusive))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user