LINUX.ORG.RU

История изменений

Исправление 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))

поскольку я в лиспе совсем никак, то не могу понять где это в данной функции.