mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-09 13:16:26 +00:00
libc-builtin: Enhance buffered print for printf_wrapper (#3460)
Move print_buf and print_buf to str_context struct to support multi-threading when BUILTIN_LIBC_BUFFERED_PRINTF macro is enabled, and fix the issue of losing some text. ps. https://github.com/bytecodealliance/wasm-micro-runtime/issues/3430.
This commit is contained in:
parent
c5ab862dbb
commit
f143344842
|
@ -321,10 +321,22 @@ fail:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef BUILTIN_LIBC_BUFFERED_PRINTF
|
||||||
|
#define BUILTIN_LIBC_BUFFERED_PRINTF 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BUILTIN_LIBC_BUFFERED_PRINT_SIZE
|
||||||
|
#define BUILTIN_LIBC_BUFFERED_PRINT_SIZE 128
|
||||||
|
#endif
|
||||||
|
|
||||||
struct str_context {
|
struct str_context {
|
||||||
char *str;
|
char *str;
|
||||||
uint32 max;
|
uint32 max;
|
||||||
uint32 count;
|
uint32 count;
|
||||||
|
#if BUILTIN_LIBC_BUFFERED_PRINTF != 0
|
||||||
|
char print_buf[BUILTIN_LIBC_BUFFERED_PRINT_SIZE];
|
||||||
|
uint32 print_buf_size;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -345,41 +357,23 @@ sprintf_out(int c, struct str_context *ctx)
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef BUILTIN_LIBC_BUFFERED_PRINTF
|
|
||||||
#define BUILTIN_LIBC_BUFFERED_PRINTF 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BUILTIN_LIBC_BUFFERED_PRINT_SIZE
|
|
||||||
#define BUILTIN_LIBC_BUFFERED_PRINT_SIZE 128
|
|
||||||
#endif
|
|
||||||
#ifndef BUILTIN_LIBC_BUFFERED_PRINT_PREFIX
|
|
||||||
#define BUILTIN_LIBC_BUFFERED_PRINT_PREFIX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if BUILTIN_LIBC_BUFFERED_PRINTF != 0
|
#if BUILTIN_LIBC_BUFFERED_PRINTF != 0
|
||||||
|
|
||||||
BUILTIN_LIBC_BUFFERED_PRINT_PREFIX
|
|
||||||
static char print_buf[BUILTIN_LIBC_BUFFERED_PRINT_SIZE] = { 0 };
|
|
||||||
|
|
||||||
BUILTIN_LIBC_BUFFERED_PRINT_PREFIX
|
|
||||||
static int print_buf_size = 0;
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
printf_out(int c, struct str_context *ctx)
|
printf_out(int c, struct str_context *ctx)
|
||||||
{
|
{
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
print_buf[print_buf_size] = '\0';
|
ctx->print_buf[ctx->print_buf_size] = '\0';
|
||||||
os_printf("%s\n", print_buf);
|
os_printf("%s\n", ctx->print_buf);
|
||||||
print_buf_size = 0;
|
ctx->print_buf_size = 0;
|
||||||
}
|
}
|
||||||
else if (print_buf_size >= sizeof(print_buf) - 2) {
|
else if (ctx->print_buf_size >= sizeof(ctx->print_buf) - 2) {
|
||||||
print_buf[print_buf_size++] = (char)c;
|
ctx->print_buf[ctx->print_buf_size++] = (char)c;
|
||||||
print_buf[print_buf_size] = '\0';
|
ctx->print_buf[ctx->print_buf_size] = '\0';
|
||||||
os_printf("%s\n", print_buf);
|
os_printf("%s\n", ctx->print_buf);
|
||||||
print_buf_size = 0;
|
ctx->print_buf_size = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
print_buf[print_buf_size++] = (char)c;
|
ctx->print_buf[ctx->print_buf_size++] = (char)c;
|
||||||
}
|
}
|
||||||
ctx->count++;
|
ctx->count++;
|
||||||
return c;
|
return c;
|
||||||
|
@ -398,7 +392,9 @@ static int
|
||||||
printf_wrapper(wasm_exec_env_t exec_env, const char *format, _va_list va_args)
|
printf_wrapper(wasm_exec_env_t exec_env, const char *format, _va_list va_args)
|
||||||
{
|
{
|
||||||
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
||||||
struct str_context ctx = { NULL, 0, 0 };
|
struct str_context ctx = { 0 };
|
||||||
|
|
||||||
|
memset(&ctx, 0, sizeof(ctx));
|
||||||
|
|
||||||
/* format has been checked by runtime */
|
/* format has been checked by runtime */
|
||||||
if (!validate_native_addr(va_args, (uint64)sizeof(int32)))
|
if (!validate_native_addr(va_args, (uint64)sizeof(int32)))
|
||||||
|
@ -408,6 +404,11 @@ printf_wrapper(wasm_exec_env_t exec_env, const char *format, _va_list va_args)
|
||||||
module_inst))
|
module_inst))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#if BUILTIN_LIBC_BUFFERED_PRINTF != 0
|
||||||
|
if (ctx.print_buf_size > 0)
|
||||||
|
os_printf("%s", ctx.print_buf);
|
||||||
|
#endif
|
||||||
|
|
||||||
return (int)ctx.count;
|
return (int)ctx.count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user