summaryrefslogtreecommitdiffstats
path: root/stream.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-07-04 07:20:40 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-07-04 07:20:40 -0700
commitf47ad62b88bcff263c3f14b3107968efffd8378a (patch)
tree730934d21b4c11354d138530370d499e78f1458a /stream.c
parent1a80dcbb725b8197369048a3eff4492e9797567f (diff)
downloadtxr-f47ad62b88bcff263c3f14b3107968efffd8378a.tar.gz
txr-f47ad62b88bcff263c3f14b3107968efffd8378a.tar.bz2
txr-f47ad62b88bcff263c3f14b3107968efffd8378a.zip
sha256: recycle I/O buffer used in stream hash.
* chksum.c (sha256_stream): Use iobuf_get and iobuf_put. * gc.c (gc): Do not mark the list of recycled buffers; just consider them to be garbage and clear the list, like we do with recycled conses via rcyc_empty. * stream.c (iobuf_free_list): New static variable. (iobuf_get, iobuf_put, iobuf_list_empty): New functions. * stream.h (iobuf_get, iobuf_put, iobuf_list_empty): Declared.
Diffstat (limited to 'stream.c')
-rw-r--r--stream.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/stream.c b/stream.c
index ec9a7f66..4cad323d 100644
--- a/stream.c
+++ b/stream.c
@@ -4605,6 +4605,33 @@ val make_byte_input_stream(val obj)
}
}
+static val iobuf_free_list;
+
+val iobuf_get(void)
+{
+ val buf = iobuf_free_list;
+
+ if (buf) {
+ val next = buf->b.len;
+ buf->b.len = buf->b.size;
+ iobuf_free_list = next;
+ return buf;
+ } else {
+ return make_buf(num_fast(BUFSIZ), nil, nil);
+ }
+}
+
+void iobuf_put(val buf)
+{
+ buf->b.len = iobuf_free_list;
+ iobuf_free_list = buf;
+}
+
+void iobuf_list_empty(void)
+{
+ iobuf_free_list = nil;
+}
+
void stream_init(void)
{
prot1(&ap_regex);