Vladimir Serbinenko (phcoder@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4288
-gerrit
commit 27f204932f36cdecf54b5b8ddad48c88e6c91bd1 Author: Vladimir Serbinenko phcoder@gmail.com Date: Tue Nov 26 21:48:57 2013 +0100
snprintf: lockless operation
Instead of having global variables put them on the stack.
Change-Id: I462e3b245612ff2dfb077da1cbcc5ac88f8b8e48 Signed-off-by: Vladimir Serbinenko phcoder@gmail.com --- src/console/vsprintf.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/console/vsprintf.c b/src/console/vsprintf.c index 435401b..6210d01 100644 --- a/src/console/vsprintf.c +++ b/src/console/vsprintf.c @@ -20,32 +20,32 @@ */
#include <string.h> -#include <smp/spinlock.h> #include <console/vtxprintf.h> #include <trace.h>
-DECLARE_SPIN_LOCK(vsprintf_lock) - -static char *str_buf; +struct context +{ + char *str_buf; +};
-static void str_tx_byte(unsigned char byte) +static void str_tx_byte(unsigned char byte, void *data) { - *str_buf = byte; - str_buf++; + struct context *ctx = data; + *ctx->str_buf = byte; + ctx->str_buf++; }
static int vsprintf(char *buf, const char *fmt, va_list args) { int i; + struct context ctx;
DISABLE_TRACE; - spin_lock(&vsprintf_lock);
- str_buf = buf; - i = vtxprintf(str_tx_byte, fmt, args); - *str_buf = '\0'; + ctx.str_buf = buf; + i = vtxdprintf(str_tx_byte, fmt, args, &ctx); + *ctx.str_buf = '\0';
- spin_unlock(&vsprintf_lock); ENABLE_TRACE;
return i;