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@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@498: lock.l_len = 0; /* "the whole file" */ 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@498: } mas01cr@498: mas01cr@498: int divest_lock(int fd) { 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@498: lock.l_len = 0; mas01cr@498: mas01cr@498: return fcntl(fd, F_SETLKW, &lock); mas01cr@498: }