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
}