From: Sebastian Hahn Date: Mon, 7 Feb 2011 14:40:14 +0000 (+0100) Subject: Locking failures on windows are indicated by EACCES X-Git-Tag: tor-0.2.3.1-alpha~137^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c7e2cf010856aabfbca042870ec1d5718c30ea4;p=thirdparty%2Ftor.git Locking failures on windows are indicated by EACCES Patch our implementation of tor_lockfile_lock() to handle this case correctly. Also add a note that blocking behaviour differs from windows to *nix. Fixes bug 2504, issue pointed out by mobmix. --- diff --git a/src/common/compat.c b/src/common/compat.c index aa42514ddf..5dfde3dc03 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -676,7 +676,10 @@ struct tor_lockfile_t { * * (Implementation note: because we need to fall back to fcntl on some * platforms, these locks are per-process, not per-thread. If you want - * to do in-process locking, use tor_mutex_t like a normal person.) + * to do in-process locking, use tor_mutex_t like a normal person. + * On Windows, when blocking is true, the maximum time that + * is actually waited is 10 seconds, after which NULL is returned + * and locked_out is set to 1.) */ tor_lockfile_t * tor_lockfile_lock(const char *filename, int blocking, int *locked_out) @@ -696,7 +699,7 @@ tor_lockfile_lock(const char *filename, int blocking, int *locked_out) #ifdef WIN32 _lseek(fd, 0, SEEK_SET); if (_locking(fd, blocking ? _LK_LOCK : _LK_NBLCK, 1) < 0) { - if (errno != EDEADLOCK) + if (errno != EACCESS && errno != EDEADLOCK) log_warn(LD_FS,"Couldn't lock \"%s\": %s", filename, strerror(errno)); else *locked_out = 1;