]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add write_pause API
authorAlan T. DeKok <aland@freeradius.org>
Tue, 7 Jan 2025 20:01:56 +0000 (15:01 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 8 Jan 2025 14:09:58 +0000 (09:09 -0500)
so that we can pause / buffer / resume writes for possible
performance improvements

src/lib/bio/mem.c
src/lib/bio/mem.h

index c66df4f187d40d34e23024b6dd53cf5529c3df32..432be24f978ba61fd4125815bc3f1381bf641d4b 100644 (file)
@@ -942,3 +942,22 @@ int fr_bio_mem_write_resume(fr_bio_t *bio)
 
        return my->cb.write_resume(bio);
 }
+
+/** Pause writes.
+ *
+ *  Calls to fr_bio_write() will write to the memory buffer, and not
+ *  to the next bio.  You MUST call fr_bio_mem_write_resume() after
+ *  this to flush any data.
+ */
+int fr_bio_mem_write_pause(fr_bio_t *bio)
+{
+       fr_bio_mem_t *my = talloc_get_type_abort(bio, fr_bio_mem_t);
+
+       if (my->bio.write == fr_bio_mem_write_buffer) return 0;
+
+       if (my->bio.write != fr_bio_mem_write_buffer) return -1;
+
+       my->bio.write = fr_bio_mem_write_buffer;
+
+       return 0;
+}
index a3f9468b7a5322728113a0f13b0c4b814ee3ace3..914acbda46e49aeccc20b99b2258d266d338ecd5 100644 (file)
@@ -63,3 +63,5 @@ void          fr_bio_mem_read_discard(fr_bio_t *bio, size_t size) CC_HINT(nonnull);
 int            fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, void *verify_ctx, bool datagram) CC_HINT(nonnull);
 
 int            fr_bio_mem_write_resume(fr_bio_t *bio) CC_HINT(nonnull);
+
+int            fr_bio_mem_write_pause(fr_bio_t *bio) CC_HINT(nonnull);