GNU bug report logs -
#21887
'monitor' form broken
Previous Next
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your bug report
#21887: 'monitor' form broken
which was filed against the guile package, has been closed.
The explanation is attached below, along with your original report.
If you require more details, please reply to 21887 <at> debbugs.gnu.org.
--
21887: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21887
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
thanks
[Message part 3 (message/rfc822, inline)]
It seems that the 'monitor' form is currently a no-op. The form
(par-for-each (lambda (x)
(monitor
(foo)))
xs)
should be functionally equivalent to
(let ((mutex (make-mutex)))
(par-for-each (lambda (x)
(with-mutex mutex
(foo)))
xs))
but currently becomes
(par-for-each (lambda (x)
(let ((mutex (make-mutex)))
(with-mutex mutex
(foo))))
xs)
which is ineffective.
I don't know what's the best way to fix this. The simplest thing that
comes to my mind is something along the lines of:
(define-syntax monitor
(lambda (stx)
(syntax-case stx ()
((_ body body* ...)
(let ((uuid (generate-uuid)))
#`(with-mutex (mutex-with-uuid #,uuid)
body body* ...))))))
where mutex-with-uuid looks it up from a hash table at run-time and
instantiates it when it doesn't exist, this operation also being
synchronized across threads, like:
(define mutex-table (make-hash-table))
(define mutex-table-mutex (make-mutex))
(define (mutex-with-uuid uuid)
(with-mutex mutex-table-mutex
(or (hash-ref mutex-table uuid)
(let ((mutex (make-mutex)))
(hash-set! mutex-table uuid mutex)
mutex))))
If that looks OK, I can try to make a proper patch from it. I'm not
sure what I'd use in place of `generate-uuid' though. Would `gensym' be
good enough?
Shameless advertisement: with SRFI-126, the (or (hash-ref ...) ...) bit
would have been just:
(hashtable-intern! mutex-table uuid make-mutex)
It's borrowed from MIT/GNU Scheme. Seems pretty useful.
Taylan
This bug report was last modified 8 years and 333 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.