mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-15 05:43:19 -08:00
Implement MP:WITH-RWLOCK
This commit is contained in:
parent
b0e7937f45
commit
c4e3e849a1
4 changed files with 21 additions and 0 deletions
|
|
@ -1564,6 +1564,7 @@ cl_symbols[] = {
|
|||
{MP_ "INTERRUPT-PROCESS", MP_ORDINARY, IF_MP(mp_interrupt_process), 2, OBJNULL},
|
||||
{MP_ "+LOAD-COMPILE-LOCK+", MP_CONSTANT, NULL, -1, OBJNULL},
|
||||
{MP_ "WITH-LOCK", MP_CONSTANT, NULL, -1, OBJNULL},
|
||||
{MP_ "WITH-RWLOCK", MP_CONSTANT, NULL, -1, OBJNULL},
|
||||
{MP_ "BLOCK-SIGNALS", MP_ORDINARY, IF_MP(mp_block_signals), 0, OBJNULL},
|
||||
{MP_ "RESTORE-SIGNALS", MP_ORDINARY, IF_MP(mp_restore_signals), 1, OBJNULL},
|
||||
{MP_ "PROCESS-SUSPEND", MP_ORDINARY, IF_MP(mp_process_suspend), 1, OBJNULL},
|
||||
|
|
|
|||
|
|
@ -1564,6 +1564,7 @@ cl_symbols[] = {
|
|||
{MP_ "INTERRUPT-PROCESS",IF_MP("mp_interrupt_process")},
|
||||
{MP_ "+LOAD-COMPILE-LOCK+",NULL},
|
||||
{MP_ "WITH-LOCK",NULL},
|
||||
{MP_ "WITH-LOCK",NULL},
|
||||
{MP_ "BLOCK-SIGNALS",IF_MP("mp_block_signals")},
|
||||
{MP_ "RESTORE-SIGNALS",IF_MP("mp_restore_signals")},
|
||||
{MP_ "PROCESS-SUSPEND",IF_MP("mp_process_suspend")},
|
||||
|
|
|
|||
|
|
@ -133,3 +133,18 @@ by ALLOW-WITH-INTERRUPTS."
|
|||
(> (the fixnum (mp:lock-count ,lock))
|
||||
(the fixnum ,count))))
|
||||
(mp::giveup-lock ,lock))))))))
|
||||
|
||||
#+ecl-read-write-lock
|
||||
(defmacro with-rwlock ((lock op) &body body)
|
||||
(assert (member op '(:read :write) :test #'eq))
|
||||
(let ((s-lock (gensym)))
|
||||
`(let ((,s-lock ,lock))
|
||||
(,(if (eq :read op)
|
||||
'mp:get-rwlock-read
|
||||
'mp:get-rwlock-write) ,s-lock t)
|
||||
(unwind-protect
|
||||
(progn
|
||||
,@body)
|
||||
(,(if (eq :read op)
|
||||
'mp:giveup-rwlock-read
|
||||
'mp:giveup-rwlock-write) ,s-lock)))))
|
||||
|
|
|
|||
|
|
@ -19,6 +19,10 @@
|
|||
(defmacro with-lock ((lock) &body body)
|
||||
`(progn ,@body))
|
||||
|
||||
#-ecl-read-write-lock
|
||||
(defmacro with-rwlock ((lock op) &body body)
|
||||
`(progn ,@body))
|
||||
|
||||
(defun safe-system (string)
|
||||
(cmpnote "Invoking external command:~% ~A" string)
|
||||
(let ((result (si:system string)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue