annotate lock.cpp @ 601:82d23418d867

Fix some fd leaks in the command-line binary Strictly speaking, they're not really leaks, because the only codepath that suffers from these leaks exits immediately afterwards. On the other hand, this fix makes valgrind on e.g. tests/0025 happier, going from 5 errors to none.
author mas01cr
date Fri, 14 Aug 2009 16:39:32 +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 }