X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/e9177b70fd0fd68d34d16b2c2f0be9110a6051c9..00a8d9210ee4c19b0b38bff5b3d7faa864b0f1de:/gdk/gdk.lisp diff --git a/gdk/gdk.lisp b/gdk/gdk.lisp index 798a657..c285f99 100644 --- a/gdk/gdk.lisp +++ b/gdk/gdk.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gdk.lisp,v 1.25 2006/04/11 18:28:38 espen Exp $ +;; $Id: gdk.lisp,v 1.26 2006/04/25 13:37:28 espen Exp $ (in-package "GDK") @@ -762,3 +762,40 @@ (defbinding cairo-rectangle () nil ;; (cr cairo:context) ;; (region region)) ) + + +;;; Multi-threading support + +#+sbcl +(progn + (defvar *global-lock* (sb-thread:make-mutex :name "global GDK lock")) + (let ((recursive-level 0)) + (defun threads-enter () + (if (eq (sb-thread:mutex-value *global-lock*) sb-thread:*current-thread*) + (incf recursive-level) + (sb-thread:get-mutex *global-lock*))) + + (defun threads-leave (&optional flush-p) + (cond + ((zerop recursive-level) + (when flush-p + (display-flush)) + (sb-thread:release-mutex *global-lock*)) + (t (decf recursive-level))))) + + (define-callback %enter-fn nil () + (threads-enter)) + + (define-callback %leave-fn nil () + (threads-leave)) + + (defbinding threads-set-lock-functions (&optional) nil + (%enter-fn callback) + (%leave-fn callback)) + + (defmacro with-global-lock (&body body) + `(progn + (threads-enter) + (unwind-protect + (progn ,@body) + (threads-leave t)))))