История изменений
Исправление alysnix, (текущая версия) :
вот в этой функции ты должен лезть в самом начале в список ридеров, искать там текущий тред, и если его там нет - грязно ругаться.
(defun rwlock-end-read (rwlock)
(declare (type rwlock rwlock))
(with-accessors ((lock %rwlock-cv-lock)
(writer-cv %rwlock-writer-cv)
(upgrade-cv %rwlock-upgrade-cv)
(reader-count %rwlock-reader-count)
(waiting-writer-count %rwlock-waiting-writer-count)
(waiting-upgrade-count %rwlock-waiting-upgrade-count)
(writer %rwlock-writer))
rwlock
(let ((self (bt2:current-thread))
wake-writer wake-upgrading)
(bt2:with-lock-held (lock)
(rwlock-modify-count rwlock self :reader-delta -1)
(when (zerop reader-count)
;; prefer waking up upgrading readers
(cond ((plusp waiting-upgrade-count)
(setf wake-upgrading t))
((plusp waiting-writer-count)
(setf wake-writer t)))))
(when wake-writer (bt2:condition-notify writer-cv))
(when wake-upgrading (bt2:condition-notify upgrade-cv))))
(values))
поскольку я в лиспе совсем никак, то не могу понять где это в данной функции. или это вообще не та функция?
а как тут раскрашивают лисповый код? вон у топикстартера красиво
Исправление alysnix, :
вот в этой функции ты должен лезть с список ридеров, искать там текущий тред, и если его там нет - грязно ругаться.
(defun rwlock-end-read (rwlock)
(declare (type rwlock rwlock))
(with-accessors ((lock %rwlock-cv-lock)
(writer-cv %rwlock-writer-cv)
(upgrade-cv %rwlock-upgrade-cv)
(reader-count %rwlock-reader-count)
(waiting-writer-count %rwlock-waiting-writer-count)
(waiting-upgrade-count %rwlock-waiting-upgrade-count)
(writer %rwlock-writer))
rwlock
(let ((self (bt2:current-thread))
wake-writer wake-upgrading)
(bt2:with-lock-held (lock)
(rwlock-modify-count rwlock self :reader-delta -1)
(when (zerop reader-count)
;; prefer waking up upgrading readers
(cond ((plusp waiting-upgrade-count)
(setf wake-upgrading t))
((plusp waiting-writer-count)
(setf wake-writer t)))))
(when wake-writer (bt2:condition-notify writer-cv))
(when wake-upgrading (bt2:condition-notify upgrade-cv))))
(values))
поскольку я в лиспе совсем никак, то не могу понять где это в данной функции. или это вообще не та функция?
а как тут раскрашивают лисповый код? вон у топикстартера красиво
Исправление alysnix, :
вот в этой функции ты должен лезть с список ридеров, искать там текущий тред, и если его там нет - грязно ругаться.
(defun rwlock-end-read (rwlock)
(declare (type rwlock rwlock))
(with-accessors ((lock %rwlock-cv-lock)
(writer-cv %rwlock-writer-cv)
(upgrade-cv %rwlock-upgrade-cv)
(reader-count %rwlock-reader-count)
(waiting-writer-count %rwlock-waiting-writer-count)
(waiting-upgrade-count %rwlock-waiting-upgrade-count)
(writer %rwlock-writer))
rwlock
(let ((self (bt2:current-thread))
wake-writer wake-upgrading)
(bt2:with-lock-held (lock)
(rwlock-modify-count rwlock self :reader-delta -1)
(when (zerop reader-count)
;; prefer waking up upgrading readers
(cond ((plusp waiting-upgrade-count)
(setf wake-upgrading t))
((plusp waiting-writer-count)
(setf wake-writer t)))))
(when wake-writer (bt2:condition-notify writer-cv))
(when wake-upgrading (bt2:condition-notify upgrade-cv))))
(values))
поскольку я в лиспе совсем никак, то не могу понять где это в данной функции. или это вообще не та функция?
Исходная версия alysnix, :
вот в этой функции ты должен лезть с список ридеров, искать там текущий тред, и если его там нет - грязно ругаться.
(defun rwlock-end-read (rwlock)
(declare (type rwlock rwlock))
(with-accessors ((lock %rwlock-cv-lock)
(writer-cv %rwlock-writer-cv)
(upgrade-cv %rwlock-upgrade-cv)
(reader-count %rwlock-reader-count)
(waiting-writer-count %rwlock-waiting-writer-count)
(waiting-upgrade-count %rwlock-waiting-upgrade-count)
(writer %rwlock-writer))
rwlock
(let ((self (bt2:current-thread))
wake-writer wake-upgrading)
(bt2:with-lock-held (lock)
(rwlock-modify-count rwlock self :reader-delta -1)
(when (zerop reader-count)
;; prefer waking up upgrading readers
(cond ((plusp waiting-upgrade-count)
(setf wake-upgrading t))
((plusp waiting-writer-count)
(setf wake-writer t)))))
(when wake-writer (bt2:condition-notify writer-cv))
(when wake-upgrading (bt2:condition-notify upgrade-cv))))
(values))
поскольку я в лиспе совсем никак, то не могу понять где это в данной функции.