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)))
|