annotate lock.cpp @ 524:469b50a3dd84 multiprobeLSH

Fixed a bug in LSH hashtable writing to disk that doesn't always sort the t2 entries into strict weak ordering. Now it does. Lots of debugging informational code inserted.
author mas01mc
date Wed, 28 Jan 2009 16:02:17 +0000
parents cc2b97d020b1
children 4eedc18634f5
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@498 7 struct flock lock;
mas01cr@498 8 int status;
mas01cr@498 9
mas01cr@498 10 lock.l_type = exclusive ? F_WRLCK : F_RDLCK;
mas01cr@498 11 lock.l_whence = SEEK_SET;
mas01cr@498 12 lock.l_start = 0;
mas01cr@498 13 lock.l_len = 0; /* "the whole file" */
mas01cr@498 14
mas01cr@498 15 retry:
mas01cr@498 16 do {
mas01cr@498 17 status = fcntl(fd, F_SETLKW, &lock);
mas01cr@498 18 } while (status != 0 && errno == EINTR);
mas01cr@498 19
mas01cr@498 20 if (status) {
mas01cr@498 21 if (errno == EAGAIN) {
mas01cr@498 22 sleep(1);
mas01cr@498 23 goto retry;
mas01cr@498 24 } else {
mas01cr@498 25 return status;
mas01cr@498 26 }
mas01cr@498 27 }
mas01cr@498 28 return 0;
mas01cr@498 29 }
mas01cr@498 30
mas01cr@498 31 int divest_lock(int fd) {
mas01cr@498 32 struct flock lock;
mas01cr@498 33
mas01cr@498 34 lock.l_type = F_UNLCK;
mas01cr@498 35 lock.l_whence = SEEK_SET;
mas01cr@498 36 lock.l_start = 0;
mas01cr@498 37 lock.l_len = 0;
mas01cr@498 38
mas01cr@498 39 return fcntl(fd, F_SETLKW, &lock);
mas01cr@498 40 }