Implement MP:WITH-RWLOCK

This commit is contained in:
Matthew Mondor 2015-08-26 09:51:34 -04:00
parent b0e7937f45
commit c4e3e849a1
4 changed files with 21 additions and 0 deletions

View file

@ -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},

View file

@ -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")},

View file

@ -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)))))

View file

@ -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)))