summaryrefslogtreecommitdiff
path: root/Core/drawing
diff options
context:
space:
mode:
authorDaniel Kochmański <daniel@turtleware.eu>2022-09-29 16:18:38 +0200
committerDaniel Kochmański <daniel@turtleware.eu>2022-10-11 22:16:21 +0200
commit2e972a61d5e1e1b2b6c5ce538fc5af466f73d0fe (patch)
tree29e3e1f154ed7fc0cfce4f02f3e7b89b0427f564 /Core/drawing
parentb774290e0c4b929a95deb06e81f27ca1f07856b6 (diff)
core: invoke-with-output-buffered: more robust implementation
This implementation of the function ensures, that the output is forced only when the buffering state changes.
Diffstat (limited to 'Core/drawing')
-rw-r--r--Core/drawing/medium.lisp18
1 files changed, 11 insertions, 7 deletions
diff --git a/Core/drawing/medium.lisp b/Core/drawing/medium.lisp
index cfdaba99..f307c7bc 100644
--- a/Core/drawing/medium.lisp
+++ b/Core/drawing/medium.lisp
@@ -335,13 +335,17 @@
(defmethod invoke-with-output-buffered
((medium basic-medium) continuation &optional (buffered-p t))
- (unwind-protect
- (letf (((medium-buffering-output-p medium) buffered-p))
- (unless buffered-p
- (medium-force-output medium))
- (funcall continuation))
- (unless (medium-buffering-output-p medium)
- (medium-force-output medium))))
+ (let ((buffering-output-p (medium-buffering-output-p medium)))
+ ;; When the buffering state changes, then we ensure that all output is
+ ;; synchronized before and after invoking the continuation.
+ ;; MEDIUM-FINISH-OUTPUT may behave differently when buffering output.
+ (if (alexandria:xor buffered-p buffering-output-p)
+ (progn
+ (medium-finish-output medium)
+ (letf (((medium-buffering-output-p medium) buffered-p))
+ (funcall continuation)
+ (medium-finish-output medium)))
+ (funcall continuation))))
;;; Default method.
(defmethod invoke-with-output-buffered