condition-variables.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP
 (HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
       condition-variables.lisp (1053B)
       ---
            1 ;;;; -*- indent-tabs-mode: nil -*-
            2 
            3 #|
            4 Copyright 2006, 2007 Greg Pfeil
            5 
            6 Distributed under the MIT license (see LICENSE file)
            7 |#
            8 
            9 (in-package #:bordeaux-threads)
           10 
           11 ;;; This file provides a portable implementation of condition
           12 ;;; variables (given a working WITH-LOCK-HELD and THREAD-YIELD), and
           13 ;;; should be used if there is no condition variable implementation in
           14 ;;; the host Lisp.
           15 
           16 (defstruct condition-var
           17   name
           18   lock
           19   active)
           20 
           21 (defun condition-wait (condition-variable lock &key timeout)
           22   (signal-error-if-condition-wait-timeout timeout)
           23   (check-type condition-variable condition-var)
           24   (setf (condition-var-active condition-variable) nil)
           25   (release-lock lock)
           26   (do ()
           27       ((when (condition-var-active condition-variable)
           28          (acquire-lock lock)
           29          t))
           30     (thread-yield))
           31   t)
           32 
           33 (define-condition-wait-compiler-macro)
           34 
           35 (defun condition-notify (condition-variable)
           36   (check-type condition-variable condition-var)
           37   (with-lock-held ((condition-var-lock condition-variable))
           38     (setf (condition-var-active condition-variable) t)))