]> git.eshelyaron.com Git - emacs.git/commitdiff
Add per-symbol mutexes
authorGemini Lasswell <gazally@runbox.com>
Mon, 15 Oct 2018 15:28:43 +0000 (08:28 -0700)
committerGemini Lasswell <gazally@runbox.com>
Fri, 23 Nov 2018 20:32:23 +0000 (12:32 -0800)
* lisp/thread.el (make-symbol-mutex): New function.
(with-symbol-mutex): New macro.

lisp/thread.el

index 65825102922ee205c852460262794ec2630c2aa7..838b8c243a3a2ffe1def600052a346372e2de6b8 100644 (file)
@@ -310,6 +310,25 @@ If there are no items in QUEUE, block until one is added."
       (condition-notify (thread--queue-not-full queue))
       item)))
 
+;;; Mutexes for variables
+
+(defun make-symbol-mutex (symbol)
+  "Create a mutex associated with SYMBOL."
+  (unless (get symbol 'thread--mutex)
+    (put symbol 'thread--mutex (make-mutex (symbol-name symbol)))))
+
+(defmacro with-symbol-mutex (symbol &rest body)
+  "Run BODY while holding the mutex for SYMBOL.
+If another thread holds the mutex, block until it is released."
+  (declare (indent 1)
+           (debug (symbolp body)))
+  (let ((g-mutex (gensym)))
+    `(let ((,g-mutex (get ',symbol 'thread--mutex)))
+       (if ,g-mutex
+           (with-mutex ,g-mutex
+             ,@body)
+         (error "`%s' doesn't have a mutex" ',symbol)))))
+
 
 (provide 'thread)
 ;;; thread.el ends here