Current CVS slime breaks when a large amount of text is printed to the REPL when using :fd-handler communication style on SBCL (tested on 1.0.19 and 1.0.20).
For example: (loop for i below 1000 do (format t "~a ......................................................................~%" i))
stops partway through the loop, pressing enter makes it print a bit more, entering a form causes it to evaluate that form and print a bit more of the original output.
backtrace from entering (break) while REPL was stopped in middle of output:
Restarts: 0: [CONTINUE] Return from BREAK. 1: [RETRY] Retry SLIME REPL evaluation request. 2: [ABORT] Abort sending output to Emacs. 3: [RETRY] Retry SLIME REPL evaluation request. 4: [ABORT] Return to SLIME's top level. 5: [ABORT] Exit debugger, returning to top level.
Backtrace: 0: (BREAK "break") 1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (BREAK) #<NULL-LEXENV>) 2: (SWANK::EVAL-REGION "(break)\n") 3: ((LAMBDA ())) 4: (SWANK::TRACK-PACKAGE #<CLOSURE (LAMBDA #) {B1BED2D}>) 5: (SWANK::CALL-WITH-RETRY-RESTART "Retry SLIME REPL evaluation request." #<CLOSURE (LAMBDA #) {B1BEC15.. 6: (SWANK::CALL-WITH-BUFFER-SYNTAX NIL #<CLOSURE (LAMBDA #) {B1BEBFD}>) 7: (SWANK::REPL-EVAL "(break)\n") 8: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SWANK:LISTENER-EVAL "(break)\n") #<NULL-LEXENV>) 9: (SWANK::EVAL-FOR-EMACS (SWANK:LISTENER-EVAL "(break)\n") "COMMON-LISP-USER" 74) 10: (SWANK::PROCESS-REQUESTS T NIL) 11: (SB-IMPL::SUB-SUB-SERVE-EVENT NIL NIL) 12: (SB-IMPL::SUB-SERVE-EVENT NIL NIL NIL) 13: (SB-SYS:WAIT-UNTIL-FD-USABLE 6 :INPUT NIL) 14: (SB-IMPL::REFILL-INPUT-BUFFER #<SB-SYS:FD-STREAM for "a socket" {AC5A119}>) 15: (SB-IMPL::INPUT-CHAR/UTF-8 #<SB-SYS:FD-STREAM for "a socket" {AC5A119}> NIL :EOF) 16: (PEEK-CHAR NIL #<SB-SYS:FD-STREAM for "a socket" {AC5A119}> NIL NIL #<unused argument>) 17: ((LAMBDA (SWANK-BACKEND::STREAMS &OPTIONAL SWANK-BACKEND::TIMEOUT)) (#<SB-SYS:FD-STREAM for "a socke.. 18: (SWANK::WAIT-FOR-EVENT/EVENT-LOOP (:EMACS-PONG 13) NIL) 19: (SWANK::WAIT-FOR-EVENT (:EMACS-PONG 13) NIL) 20: (SWANK::SEND-USER-OUTPUT ..) 21: ((LAMBDA ())) 22: ((LAMBDA ())) 23: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-RECURSIVE-LOCK]508)) 24: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..) 25: ((LAMBDA (SWANK-BACKEND::LOCK FUNCTION)) #S(SB-THREAD:MUTEX :NAME "buffer write lock" :%OWNER #<SB-T.. 26: ((SB-PCL::FAST-METHOD STREAM-FINISH-OUTPUT (SWANK-BACKEND::SLIME-OUTPUT-STREAM)) #(3 NIL 2 NIL 5 NIL.. 27: ((LAMBDA ())) 28: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-RECURSIVE-LOCK]508)) 29: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..) 30: ((LAMBDA (SWANK-BACKEND::LOCK FUNCTION)) #S(SB-THREAD:MUTEX :NAME "buffer write lock" :%OWNER #<SB-T.. 31: ((SB-PCL::FAST-METHOD STREAM-WRITE-STRING (SWANK-BACKEND::SLIME-OUTPUT-STREAM T)) ..) 32: (WRITE-STRING " ......................................................................" #<SWANK-BACK.. 33: (SB-FORMAT::INTERPRET-DIRECTIVE-LIST #<SWANK-BACKEND::SLIME-OUTPUT-STREAM {A6EC099}> (" .............. 34: (SB-FORMAT::%FORMAT #SWANK-BACKEND::SLIME-OUTPUT-STREAM {A6EC099} "~a .............................. 35: (FORMAT T "~a ......................................................................~%")[:EXTERNAL] 36: ((LAMBDA ())) 37: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LOOP FOR I BELOW 1000 DO ...) #<NULL-LEXENV>) 38: (SWANK::EVAL-REGION "(loop for i below 1000 do (format t "~a ........................................ 39: ((LAMBDA ())) 40: (SWANK::TRACK-PACKAGE #<CLOSURE (LAMBDA #) {AFDEC95}>) 41: (SWANK::CALL-WITH-RETRY-RESTART "Retry SLIME REPL evaluation request." #<CLOSURE (LAMBDA #) {AFDEB7D.. 42: (SWANK::CALL-WITH-BUFFER-SYNTAX NIL #<CLOSURE (LAMBDA #) {AFDEB65}>) 43: (SWANK::REPL-EVAL "(loop for i below 1000 do (format t "~a .......................................... 44: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SWANK:LISTENER-EVAL "(loop for i below 1000 do (format t "~a ......... 45: (SWANK::EVAL-FOR-EMACS (SWANK:LISTENER-EVAL "(loop for i below 1000 do (format t "~a ................ 46: (SWANK::PROCESS-REQUESTS T NIL) 47: ((LAMBDA ())) 48: ((LAMBDA (SWANK-BACKEND::HOOK SWANK-BACKEND::FUN)) #<FUNCTION SWANK:SWANK-DEBUGGER-HOOK> #<CLOSURE (.. 49: (SWANK::CALL-WITH-REDIRECTED-IO #<SWANK::CONNECTION {AC5AD59}> #<CLOSURE (LAMBDA #) {AFCBF35}>) 50: (SWANK::CALL-WITH-CONNECTION #<SWANK::CONNECTION {AC5AD59}> #<CLOSURE (LAMBDA #) {AFCBF25}>) 51: (SWANK::HANDLE-REQUESTS #<SWANK::CONNECTION {AC5AD59}> T NIL) 52: (SB-IMPL::SUB-SUB-SERVE-EVENT NIL NIL) 53: (SB-IMPL::SUB-SERVE-EVENT NIL NIL NIL) 54: (SB-SYS:WAIT-UNTIL-FD-USABLE 0 :INPUT NIL) 55: (SB-IMPL::REFILL-INPUT-BUFFER #<SB-SYS:FD-STREAM for "standard input" {A6E57F1}>) 56: (SB-IMPL::INPUT-CHAR/UTF-8 #<SB-SYS:FD-STREAM for "standard input" {A6E57F1}> NIL #:EOF-OBJECT) 57: (READ-CHAR #<SB-SYS:FD-STREAM for "standard input" {A6E57F1}> NIL #:EOF-OBJECT #<unused argument>) 58: (READ-CHAR #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {90DA579}> NIL #:EOF-OBJECT #<unused argument>) 59: (READ-PRESERVING-WHITESPACE #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {90DA579}> NIL (NIL) T) 60: (READ-PRESERVING-WHITESPACE #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {90DA579}> NIL (NIL) NIL) 61: (READ #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {90DA579}> NIL (NIL) NIL) 62: (SB-IMPL::REPL-READ-FORM-FUN #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {90DA579}> #<unavailable argume.. 63: (SB-IMPL::REPL-FUN NIL) 64: (SB-IMPL::REPL-FUN NIL)[:EXTERNAL] 65: ((LAMBDA ())) 66: ((LAMBDA ()))[:EXTERNAL] 67: (SB-IMPL::%WITH-REBOUND-IO-SYNTAX #<CLOSURE (LAMBDA #) {A6E8AD5}>) 68: (SB-IMPL::TOPLEVEL-REPL NIL) 69: (SB-IMPL::TOPLEVEL-INIT) 70: ((LABELS SB-IMPL::RESTART-LISP))
* Bart Botta [2008-09-22 00:29+0200] writes:
Current CVS slime breaks when a large amount of text is printed to the REPL when using :fd-handler communication style on SBCL (tested on 1.0.19 and 1.0.20).
Apparently something changed in SBCL between 1.0.4 and 1.0.19. Previously only the last established handler per fd would be called, now they call all handlers. As a consequence, read-char-no-hang may now hang if we have a fd-handler on the same fd. (It hangs in unix-read inside a without-interrupts. Bonus points for that feat :-)
Should be no longer be an issue for CVS SLIME.
Helmut.