snprintf: lockless operation

Instead of having global variables put them on the stack.

Change-Id: I462e3b245612ff2dfb077da1cbcc5ac88f8b8e48
Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-on: http://review.coreboot.org/4288
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Tested-by: build bot (Jenkins)
This commit is contained in:
Vladimir Serbinenko 2013-11-26 21:48:57 +01:00
parent f421b33edb
commit 2267658db4
1 changed files with 13 additions and 13 deletions

View File

@ -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;
static void str_tx_byte(unsigned char byte)
struct vsprintf_context
{
*str_buf = byte;
str_buf++;
char *str_buf;
};
static void str_tx_byte(unsigned char byte, void *data)
{
struct vsprintf_context *ctx = data;
*ctx->str_buf = byte;
ctx->str_buf++;
}
static int vsprintf(char *buf, const char *fmt, va_list args)
{
int i;
struct vsprintf_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;