3d2e55ad53
The input adapter streams were input streams yielding either binary or character data that could be constructed from a variable data source. The stream would take care not to destroy the underlying data source (i.e. not close it if it was a stream), so similar to with FILE-PORTIONs, but simpler. Unfortunately, the implementation was quite inefficient: They are ultimately defined in terms of a function that retrieves the next character in the source. This only allows for an implementation of READ-CHAR (and READ-BYTE). Thanks to cl/8559, READ-SEQUENCE can be used on e.g. FILE-PORTION, but this was still negated by a input adapter based on one—then, READ-SEQUENCE would need to fall back on READ-CHAR or READ-BYTE again. Luckily, we can replace BINARY-INPUT-ADAPTER-STREAM and CHARACTER-INPUT-ADAPTER-STREAM with a much simpler abstraction: Instead of extra stream classes, we have a function, MAKE-INPUT-ADAPTER, which returns an appropriate instance of FLEXI-STREAM based on a given source. This way, the need for a distinction between binary and character input adapter is eliminated, since FLEXI-STREAMS supports both binary and character reads (external format is not yet handled, though). Consequently, the :binary keyword argument to MIME-BODY-STREAM can be dropped. flexi-streams provides stream classes for everything except a stream that doesn't close the underlying one. Since we have already implemented this in POSITIONED-FLEXI-INPUT-STREAM, we can split this functionality into a new superclass ADAPTER-FLEXI-INPUT-STREAM. This change also allows addressing the performance regression encountered in cl/8559: It seems that flexi-streams performs worse when we are reading byte by byte or char by char. (After this change mblog is still two times slower than on r/6150.) By eliminating the adapter streams, we can start utilizing READ-SEQUENCE via decoding code that supports it (i.e. qbase64) and bring performance on par with r/6150 again. Surely there are also ways to gain back even more performance which has to be determined using profiling. Buffering more aggressively seems like a sure bet, though. Switching to flexi-streams still seems like a no-brainer, as it allows us to drop a lot of code that was quite hacky (e.g. DELIMITED-INPUT- STREAM) and implements en/decoding handling we did not support before, but would need for improved correctness. Change-Id: Ie2d1f4e42b47512a5660a1ccc0deeec2bff9788d Reviewed-on: https://cl.tvl.fyi/c/depot/+/8581 Autosubmit: sterni <sternenseemann@systemli.org> Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI |
||
---|---|---|
.. | ||
asdf-flv | ||
closure-html | ||
mime4cl | ||
npg | ||
qbase64 | ||
quasiquote_2 | ||
s-xml | ||
alexandria.nix | ||
anaphora.nix | ||
babel.nix | ||
bordeaux-threads.nix | ||
cffi.nix | ||
chipz.nix | ||
chunga.nix | ||
cl-ansi-text.nix | ||
cl-base64.nix | ||
cl-colors.nix | ||
cl-colors2.nix | ||
cl-date-time-parser.nix | ||
cl-fad.nix | ||
cl-json.nix | ||
cl-plus-ssl.nix | ||
cl-ppcre.nix | ||
cl-prevalence.nix | ||
cl-smtp.nix | ||
cl-unicode.nix | ||
cl-who.nix | ||
cl-yacc.nix | ||
closer-mop.nix | ||
closure-common.nix | ||
defclass-std.nix | ||
drakma.nix | ||
easy-routes.nix | ||
fiveam.nix | ||
flexi-streams.nix | ||
global-vars.nix | ||
hunchentoot.nix | ||
ironclad.nix | ||
iterate.nix | ||
lass.nix | ||
let-plus.nix | ||
lisp-binary.nix | ||
local-time.nix | ||
marshal.nix | ||
md5.nix | ||
metabang-bind.nix | ||
moptilities.nix | ||
nibbles.nix | ||
OWNERS | ||
parse-float.nix | ||
parse-number.nix | ||
parseq.nix | ||
physical-quantities.nix | ||
postmodern.nix | ||
prove.nix | ||
puri.nix | ||
rfc2388.nix | ||
routes.nix | ||
s-sysdeps.nix | ||
split-sequence.nix | ||
trivial-backtrace.nix | ||
trivial-features.nix | ||
trivial-garbage.nix | ||
trivial-gray-streams.nix | ||
trivial-indent.nix | ||
trivial-ldap.nix | ||
trivial-mimes.nix | ||
uax-15.nix | ||
unix-opts.nix | ||
usocket-server.nix | ||
usocket.nix |