Mercurial > hg > audiodb
view lock.cpp @ 596:6ad0a6e67d4c
Take advantage of those new handy _or_goto_error macros
Use them in various places where previously we either elided the error
checking (various lseek() calls) or used a combination of calls
(replaced by malloc_and_fill_or_goto_error()).
In the process, fix what is probably a bug (or else introduce one, but I
don't think so): audiodb_track_id_datum() computed the offset into the
timesTable wrongly, forgetting to multiply by 2. (TODO: this should be
easily testable using the API).
Now all of LIBOBJS can be produced by my (Debian's) mingw32
cross-compiler, except for lshlib.o.
author | mas01cr |
---|---|
date | Tue, 11 Aug 2009 21:42:49 +0000 |
parents | 4eedc18634f5 |
children |
line wrap: on
line source
extern "C" { #include "audioDB_API.h" } #include "audioDB-internals.h" int acquire_lock(int fd, bool exclusive) { #if !defined(WIN32) struct flock lock; int status; lock.l_type = exclusive ? F_WRLCK : F_RDLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = ADB_HEADER_SIZE; retry: do { status = fcntl(fd, F_SETLKW, &lock); } while (status != 0 && errno == EINTR); if (status) { if (errno == EAGAIN) { sleep(1); goto retry; } else { return status; } } return 0; #else /* _locking() only supports exclusive locks */ int status; retry: status = _locking(fd, _LK_NBLCK, ADB_HEADER_SIZE); if(status) { Sleep(1000); goto retry; } return 0; #endif } int divest_lock(int fd) { #if !defined(WIN32) struct flock lock; lock.l_type = F_UNLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = ADB_HEADER_SIZE; return fcntl(fd, F_SETLKW, &lock); #else return _locking(fd, _LK_UNLCK, ADB_HEADER_SIZE); #endif }