(zilch statusbar): fix the deadlock
The statusbar code contained a deadlock in error cases, which, somehow, was a heisenbug. After a 2-hour long debugging session today, it has finally been spotted and _solved_. I should some day move off Chicken Scheme. Change-Id: If0c2a2b6db10b5620c12f191f13af4c86a6a6964
This commit is contained in:
parent
de26625157
commit
ace83f3b1b
1 changed files with 16 additions and 1 deletions
|
|
@ -40,7 +40,22 @@
|
||||||
(when start
|
(when start
|
||||||
(redraw-status-bar))
|
(redraw-status-bar))
|
||||||
(mutex-unlock! mutex))))
|
(mutex-unlock! mutex))))
|
||||||
(make-output-port (lambda (str) (mutex-lock! mutex) (write-data (string->utf8 str) 0)) close-this-port))
|
(make-output-port
|
||||||
|
(lambda (str)
|
||||||
|
; In some rare cases, due to how Chicken Scheme handles errors,
|
||||||
|
; it is possible for us to seemingly recursively have been called
|
||||||
|
; while in the error handler. If this is the case (e.g. we are about
|
||||||
|
; to attempt to lock a mutex we ostensibly own), bail out and unlock
|
||||||
|
; the mutex.
|
||||||
|
(when (eq? (mutex-state mutex) (current-thread))
|
||||||
|
(mutex-unlock! mutex))
|
||||||
|
|
||||||
|
; Try to force-disable the error handling behavior.
|
||||||
|
(##sys#print-length-limit #f)
|
||||||
|
|
||||||
|
(mutex-lock! mutex)
|
||||||
|
(write-data (string->utf8 str) 0))
|
||||||
|
close-this-port))
|
||||||
|
|
||||||
;; Creates a status bar. Ensures redraws are limited where necessary, and will erase itself before printing `stdout`. `stderr` output will be put in the statusbar.
|
;; Creates a status bar. Ensures redraws are limited where necessary, and will erase itself before printing `stdout`. `stderr` output will be put in the statusbar.
|
||||||
;; if `print-logs` is `#t`, will output stderr to the display.
|
;; if `print-logs` is `#t`, will output stderr to the display.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue