annotate lock.cpp @ 770:c54bc2ffbf92 tip

update tags
author convert-repo
date Fri, 16 Dec 2011 11:34:01 +0000
parents 4eedc18634f5
children
rev   line source
mas01cr@509 1 extern "C" {
mas01cr@509 2 #include "audioDB_API.h"
mas01cr@509 3 }
mas01cr@509 4 #include "audioDB-internals.h"
mas01cr@498 5
mas01cr@498 6 int acquire_lock(int fd, bool exclusive) {
mas01cr@590 7 #if !defined(WIN32)
mas01cr@498 8 struct flock lock;
mas01cr@498 9 int status;
mas01cr@498 10
mas01cr@498 11 lock.l_type = exclusive ? F_WRLCK : F_RDLCK;
mas01cr@498 12 lock.l_whence = SEEK_SET;
mas01cr@498 13 lock.l_start = 0;
mas01cr@590 14 lock.l_len = ADB_HEADER_SIZE;
mas01cr@498 15
mas01cr@498 16 retry:
mas01cr@498 17 do {
mas01cr@498 18 status = fcntl(fd, F_SETLKW, &lock);
mas01cr@498 19 } while (status != 0 && errno == EINTR);
mas01cr@498 20
mas01cr@498 21 if (status) {
mas01cr@498 22 if (errno == EAGAIN) {
mas01cr@498 23 sleep(1);
mas01cr@498 24 goto retry;
mas01cr@498 25 } else {
mas01cr@498 26 return status;
mas01cr@498 27 }
mas01cr@498 28 }
mas01cr@498 29 return 0;
mas01cr@590 30 #else
mas01cr@590 31 /* _locking() only supports exclusive locks */
mas01cr@590 32 int status;
mas01cr@590 33
mas01cr@590 34 retry:
mas01cr@590 35 status = _locking(fd, _LK_NBLCK, ADB_HEADER_SIZE);
mas01cr@590 36 if(status) {
mas01cr@590 37 Sleep(1000);
mas01cr@590 38 goto retry;
mas01cr@590 39 }
mas01cr@590 40 return 0;
mas01cr@590 41 #endif
mas01cr@498 42 }
mas01cr@498 43
mas01cr@498 44 int divest_lock(int fd) {
mas01cr@590 45 #if !defined(WIN32)
mas01cr@498 46 struct flock lock;
mas01cr@498 47
mas01cr@498 48 lock.l_type = F_UNLCK;
mas01cr@498 49 lock.l_whence = SEEK_SET;
mas01cr@498 50 lock.l_start = 0;
mas01cr@590 51 lock.l_len = ADB_HEADER_SIZE;
mas01cr@498 52
mas01cr@498 53 return fcntl(fd, F_SETLKW, &lock);
mas01cr@590 54 #else
mas01cr@590 55 return _locking(fd, _LK_UNLCK, ADB_HEADER_SIZE);
mas01cr@590 56 #endif
mas01cr@498 57 }