mas01cr@509: extern "C" { mas01cr@509: #include "audioDB_API.h" mas01cr@509: } mas01cr@509: #include "audioDB-internals.h" mas01cr@498: mas01cr@498: int acquire_lock(int fd, bool exclusive) { mas01cr@590: #if !defined(WIN32) mas01cr@498: struct flock lock; mas01cr@498: int status; mas01cr@498: mas01cr@498: lock.l_type = exclusive ? F_WRLCK : F_RDLCK; mas01cr@498: lock.l_whence = SEEK_SET; mas01cr@498: lock.l_start = 0; mas01cr@590: lock.l_len = ADB_HEADER_SIZE; mas01cr@498: mas01cr@498: retry: mas01cr@498: do { mas01cr@498: status = fcntl(fd, F_SETLKW, &lock); mas01cr@498: } while (status != 0 && errno == EINTR); mas01cr@498: mas01cr@498: if (status) { mas01cr@498: if (errno == EAGAIN) { mas01cr@498: sleep(1); mas01cr@498: goto retry; mas01cr@498: } else { mas01cr@498: return status; mas01cr@498: } mas01cr@498: } mas01cr@498: return 0; mas01cr@590: #else mas01cr@590: /* _locking() only supports exclusive locks */ mas01cr@590: int status; mas01cr@590: mas01cr@590: retry: mas01cr@590: status = _locking(fd, _LK_NBLCK, ADB_HEADER_SIZE); mas01cr@590: if(status) { mas01cr@590: Sleep(1000); mas01cr@590: goto retry; mas01cr@590: } mas01cr@590: return 0; mas01cr@590: #endif mas01cr@498: } mas01cr@498: mas01cr@498: int divest_lock(int fd) { mas01cr@590: #if !defined(WIN32) mas01cr@498: struct flock lock; mas01cr@498: mas01cr@498: lock.l_type = F_UNLCK; mas01cr@498: lock.l_whence = SEEK_SET; mas01cr@498: lock.l_start = 0; mas01cr@590: lock.l_len = ADB_HEADER_SIZE; mas01cr@498: mas01cr@498: return fcntl(fd, F_SETLKW, &lock); mas01cr@590: #else mas01cr@590: return _locking(fd, _LK_UNLCK, ADB_HEADER_SIZE); mas01cr@590: #endif mas01cr@498: }