avoid flock() under Solaris

This commit is contained in:
Matthew Flatt 2011-05-24 06:18:40 -06:00
parent 31009166d7
commit 23777f291c
4 changed files with 20 additions and 1 deletions

View File

@ -321,7 +321,8 @@ advisory on other platforms.
Typically, locking is supported only for file ports, and attempting to
acquire a lock with other kinds of file-stream ports raises an
@racket[exn:fail:filesystem] exception.}
@racket[exn:fail:filesystem] exception. Locking is not supported under Solaris,
where the @racket[exn:fail:unsupported] exception is raised.}
@defproc[(port-file-unlock [port file-stream-port?])

View File

@ -99,6 +99,7 @@
# define USE_FCNTL_O_NONBLOCK
# define SOME_FDS_ARE_NOT_SELECTABLE
# define NEED_RESET_STDOUT_BLOCKING
# undef USE_FLOCK_FOR_FILE_LOCKS
# define USE_TIMEZONE_AND_ALTZONE_VAR
# define USE_NULL_TO_DISCONNECT_UDP
# else
@ -1050,6 +1051,9 @@
pending bytes. Don't use this unless one of the HAS_<X>_IOB
flags is used. */
/* USE_FLOCK_FOR_FILE_LOCKS means that flock() is available and works
for file locking. */
/* CLOSE_ALL_FDS_AFTER_FORK means that all fds except 0, 1, and 2
should be closed after performing a fork() for `process'
and `system' calls. */

View File

@ -4694,6 +4694,7 @@ scheme_file_buffer(int argc, Scheme_Object *argv[])
static int try_lock(int fd, int writer, int *_errid)
{
#ifdef UNIX_FILE_SYSTEM
# ifdef USE_FLOCK_FOR_FILE_LOCKS
{
int ok;
@ -4712,6 +4713,13 @@ static int try_lock(int fd, int writer, int *_errid)
*_errid = errno;
return 0;
}
# else
/* using fcntl(F_SETFL, ...) isn't really an option, since the
any-close-release-the-lock semantics of fcntl()-based locks
doesn't work with Racket threads that compete for a lock */
*_errid = ENOTSUP;
return 0;
# endif
#endif
#ifdef WINDOWS_FILE_HANDLES
{
@ -4804,11 +4812,16 @@ Scheme_Object *scheme_file_unlock(int argc, Scheme_Object **argv)
check_already_closed("port-file-unlock", argv[0]);
#ifdef UNIX_FILE_SYSTEM
# ifdef USE_FLOCK_FOR_FILE_LOCKS
do {
ok = flock(fd, LOCK_UN);
} while ((ok == -1) && (errno == EINTR));
ok = !ok;
errid = errno;
# else
ok = 0;
errid = ENOTSUP;
# endif
#endif
#ifdef WINDOWS_FILE_HANDLES
ok = UnlockFile((HANDLE)fd, 0, 0, LOCK_ALL_FILE_LO, LOCK_ALL_FILE_HI);

View File

@ -14,6 +14,7 @@
#define HAS_STANDARD_IOB
#define FILES_HAVE_FDS
#define USE_UNIX_SOCKETS_TCP
#define USE_FLOCK_FOR_FILE_LOCKS
#define UNIX_PROCESSES
#define CLOSE_ALL_FDS_AFTER_FORK