;;;; -*- coding: utf-8; fill-column: 78 -*-
changes relative to sbcl-1.0.36:
- * DEPRECIATION: the SB-QUEUE contrib was merged into the SB-CONCURRENCY
+ * INCOMPATIBLE CHANGE: Thread names are now restricted to SIMPLE-STRINGs
+ like for any other thread-related datastructure (MUTEX, etc.)
+ * DEPRECATION: the SB-QUEUE contrib was merged into the SB-CONCURRENCY
contrib module. New code should depend on SB-CONCURRENCY, not SB-QUEUE.
- * DEPRECIATION: SB-THEAD:GET-MUTEX was deprecated in favor of
+ * DEPRECATION: SB-THEAD:GET-MUTEX was deprecated in favor of
SB-THREAD:GRAB-MUTEX.
* new contrib: SB-CONCURRENCY is a new contrib; it's supposed to contain
additional data structures and tools for concurrent programming; at the
#!+(and sb-lutex sb-thread)
(lutex (make-lutex))
#!-sb-lutex
- (data nil))
+ (token nil))
(defun make-waitqueue (&key name)
#!+sb-doc
"The name of the waitqueue. Setfable.")
#!+(and sb-thread (not sb-lutex))
-(define-structure-slot-addressor waitqueue-data-address
+(define-structure-slot-addressor waitqueue-token-address
:structure waitqueue
- :slot data)
+ :slot token)
(defun condition-wait (queue mutex)
#!+sb-doc
;; memory barrier semantics of lock acquire/release. This must
;; not be moved into the loop else wakeups may be lost upon
;; continuing after a deadline or EINTR.
- (setf (waitqueue-data queue) me)
+ (setf (waitqueue-token queue) me)
(loop
(multiple-value-bind (to-sec to-usec)
(allow-with-interrupts (decode-timeout nil))
(case (unwind-protect
(with-pinned-objects (queue me)
;; RELEASE-MUTEX is purposefully as close to
- ;; FUTEX-WAIT as possible to reduce the size
- ;; of the window where WAITQUEUE-DATA may be
- ;; set by a notifier.
+ ;; FUTEX-WAIT as possible to reduce the size of
+ ;; the window where the token may be set by a
+ ;; notifier.
(release-mutex mutex)
;; Now we go to sleep using futex-wait. If
;; anyone else manages to grab MUTEX and call
;; CONDITION-NOTIFY during this comment, it
- ;; will change queue->data, and so futex-wait
+ ;; will change the token, and so futex-wait
;; returns immediately instead of sleeping.
;; Ergo, no lost wakeup. We may get spurious
;; wakeups, but that's ok.
(allow-with-interrupts
- (futex-wait (waitqueue-data-address queue)
+ (futex-wait (waitqueue-token-address queue)
(get-lisp-obj-address me)
;; our way of saying "no
;; timeout":
;; signal a deadline unconditionally here because the
;; call to GET-MUTEX may already have signaled it.
((1))
- ;; EINTR
+ ;; EINTR; we do not need to return to the caller because
+ ;; an interleaved wakeup would change the token causing an
+ ;; EWOULDBLOCK in the next iteration.
((2))
;; EWOULDBLOCK, -1 here, is the possible spurious wakeup
;; case. 0 is the normal wakeup.
;; ^-- surely futex_wake() involves a memory barrier?
#!-sb-lutex
(progn
- (setf (waitqueue-data queue) queue)
+ (setf (waitqueue-token queue) queue)
(with-pinned-objects (queue)
- (futex-wake (waitqueue-data-address queue) n)))))
+ (futex-wake (waitqueue-token-address queue) n)))))
(defun condition-broadcast (queue)
#!+sb-doc