From fec434a4e2d0ff65510581e461d87a945d25759a Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Thu, 23 Oct 2025 10:17:00 +0300 Subject: Use serapeum's -> & defsubst --- src/rw-lock.lisp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/rw-lock.lisp') diff --git a/src/rw-lock.lisp b/src/rw-lock.lisp index dc8850d..b8d08b1 100644 --- a/src/rw-lock.lisp +++ b/src/rw-lock.lisp @@ -7,6 +7,7 @@ (:import-from :com.dieggsy.f-string :enable-f-strings) (:import-from :sb-sys :allow-with-interrupts :with-local-interrupts :without-interrupts) + (:import-from :serapeum :->) (:export #:rw-lock #:rw-lock-p @@ -36,12 +37,14 @@ (defvar *counter* 0) +(-> gen-name () string) (defun gen-name () "Generate a name for a rw-lock" (format nil "Read-Write Lock ~A" (with-lock-held (*counter-lock*) (incf *counter*)))) +(-> make-rw-lock (&key (:name string)) rw-lock) (defun make-rw-lock (&key (name (gen-name))) (check-type name string) (make-rw-lock% @@ -49,6 +52,7 @@ :reader-cv (make-condition-variable :name #f"{name}'s internal reader-cv") :writer-cv (make-condition-variable :name #f"{name}'s internal writer-cv"))) +(-> wakeup-waiters (rw-lock) (values &optional)) (defun wakeup-waiters (rw-lock) ;; NOTE: RW-LOCK-LOCK HAS TO BE TAKEN! (declare (type rw-lock rw-lock)) @@ -57,8 +61,10 @@ ((zerop waiting-readers) (condition-notify writer-cv)) ((zerop waiting-writers) (condition-broadcast reader-cv)) (t (whichever (condition-notify writer-cv) - (condition-broadcast reader-cv)))))) + (condition-broadcast reader-cv))))) + (values)) +(-> acquire-read-lock (rw-lock &key (:wait boolean)) boolean) (defun acquire-read-lock (rw-lock &key (wait t)) ;; TODO: timeout (check-type rw-lock rw-lock) @@ -83,6 +89,7 @@ (decf waiting-readers) (release-lock lock))))))) +(-> release-read-lock (rw-lock) rw-lock) (defun release-read-lock (rw-lock) (check-type rw-lock rw-lock) (with-slots (lock active-readers active-writer) rw-lock @@ -107,6 +114,7 @@ (when ,lock-acquired (release-read-lock ,lock-value))))))) +(-> acquire-write-lock (rw-lock &key (:wait boolean)) boolean) (defun acquire-write-lock (rw-lock &key (wait t)) ;; TODO: timeout (check-type rw-lock rw-lock) @@ -131,6 +139,7 @@ (decf waiting-writers) (release-lock lock))))))) +(-> release-write-lock (rw-lock) rw-lock) (defun release-write-lock (rw-lock) (check-type rw-lock rw-lock) (with-slots (lock active-readers active-writer) rw-lock -- cgit v1.2.3