summaryrefslogtreecommitdiffstats
path: root/lockdir.tl
blob: 3d6fe0f2bee4c73a4ec3176e180c39c381bbe858 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(defun acquire-lock (path)
  (let ((lock `@path.#lock#`)
        (start-time (time)))
    (while (< (- (time) start-time) 30)
      (catch (if (mkdir lock #o700)
               (return-from acquire-lock lock))
        (file-error (e)
          (unless (= 17 (errno))
            (throw 'file-error e))
          (usleep 1000000))))
    (error "acquire-lock: unable to acquire ~a" lock))) 

(defun release-lock (lock)
  (ignerr (remove-path lock)))

(defmacro with-lock (path . body)
  (let ((lock (gensym)))
    ^(with-resources ((,lock (acquire-lock ,path) (release-lock ,lock)))
       ,*body)))