[PATCH 2/8] libtest: Add output buffer drain and fill

Sebastian Huber sebastian.huber at embedded-brains.de
Thu Aug 13 10:11:27 UTC 2020


Update #3199.
---
 cpukit/libtest/t-test.c | 60 ++++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 25 deletions(-)

diff --git a/cpukit/libtest/t-test.c b/cpukit/libtest/t-test.c
index b1b5253bb5..e8d0542c31 100644
--- a/cpukit/libtest/t-test.c
+++ b/cpukit/libtest/t-test.c
@@ -143,15 +143,12 @@ T_snprintf(char *s, size_t n, char const *fmt, ...)
 	return len;
 }
 
-static int
-T_vprintf_direct(char const *fmt, va_list ap)
+static void
+T_output_buffer_drain(T_context *ctx)
 {
-	T_context *ctx;
 	unsigned int head;
 	unsigned int tail;
 
-	ctx = &T_instance;
-
 	head = atomic_load_explicit(&ctx->buf_head, memory_order_acquire);
 	tail = atomic_load_explicit(&ctx->buf_tail, memory_order_relaxed);
 
@@ -161,32 +158,16 @@ T_vprintf_direct(char const *fmt, va_list ap)
 	}
 
 	atomic_store_explicit(&ctx->buf_tail, tail, memory_order_relaxed);
-
-	return _IO_Vprintf(ctx->putchar, ctx->putchar_arg, fmt, ap);
 }
 
-static int
-T_vprintf_buffered(char const *fmt, va_list ap)
+static unsigned int
+T_output_buffer_fill(T_context *ctx, const char *buf, unsigned int len)
 {
-	unsigned int len;
-	T_context *ctx;
-	char buf[T_LINE_SIZE];
-	T_putchar_string_context sctx = {
-		.s = buf,
-		.n = sizeof(buf)
-	};
 	unsigned int head;
 	unsigned int tail;
 	unsigned int mask;
 	unsigned int capacity;
 
-	len = (unsigned int)_IO_Vprintf(T_putchar_string, &sctx, fmt, ap);
-
-	if (len >= sizeof(buf)) {
-		len = sizeof(buf) - 1;
-	}
-
-	ctx = &T_instance;
 	pthread_spin_lock(&ctx->lock);
 	head = atomic_load_explicit(&ctx->buf_head, memory_order_relaxed);
 	tail = atomic_load_explicit(&ctx->buf_tail, memory_order_relaxed);
@@ -195,7 +176,7 @@ T_vprintf_buffered(char const *fmt, va_list ap)
 
 	if (len <= capacity) {
 		unsigned int todo;
-		char *c;
+		const char *c;
 
 		todo = len;
 		c = buf;
@@ -215,7 +196,36 @@ T_vprintf_buffered(char const *fmt, va_list ap)
 	}
 
 	pthread_spin_unlock(&ctx->lock);
-	return (int)len;
+	return len;
+}
+
+static int
+T_vprintf_direct(char const *fmt, va_list ap)
+{
+	T_context *ctx;
+
+	ctx = &T_instance;
+	T_output_buffer_drain(ctx);
+	return _IO_Vprintf(ctx->putchar, ctx->putchar_arg, fmt, ap);
+}
+
+static int
+T_vprintf_buffered(char const *fmt, va_list ap)
+{
+	char buf[T_LINE_SIZE];
+	T_putchar_string_context sctx = {
+		.s = buf,
+		.n = sizeof(buf)
+	};
+	unsigned int len;
+
+	len = (unsigned int)_IO_Vprintf(T_putchar_string, &sctx, fmt, ap);
+
+	if (len >= sizeof(buf)) {
+		len = sizeof(buf) - 1;
+	}
+
+	return (int)T_output_buffer_fill(&T_instance, buf, len);
 }
 
 int
-- 
2.26.2



More information about the devel mailing list