Threaded logger output

This commit is contained in:
def 2014-09-09 23:02:05 +02:00
parent d44e6088bb
commit 49682f4a8d
4 changed files with 119 additions and 11 deletions

View file

@ -88,12 +88,36 @@ void dbg_break()
*((volatile unsigned*)0) = 0x0; *((volatile unsigned*)0) = 0x0;
} }
#define QUEUE_SIZE 16
typedef struct
{
char q[QUEUE_SIZE][1024*4];
int begin;
int end;
LOCK mutex;
LOCK notempty;
LOCK notfull;
} Queue;
static int dbg_msg_threaded = 0;
static Queue log_queue;
int queue_empty(Queue *q)
{
return q->begin == q->end;
}
int queue_full(Queue *q)
{
return ((q->end+1) % QUEUE_SIZE) == q->begin;
}
void dbg_msg(const char *sys, const char *fmt, ...) void dbg_msg(const char *sys, const char *fmt, ...)
{ {
va_list args; va_list args;
char str[1024*4];
char *msg; char *msg;
int i, len; int len;
//str_format(str, sizeof(str), "[%08x][%s]: ", (int)time(0), sys); //str_format(str, sizeof(str), "[%08x][%s]: ", (int)time(0), sys);
time_t rawtime; time_t rawtime;
@ -104,21 +128,101 @@ void dbg_msg(const char *sys, const char *fmt, ...)
timeinfo = localtime ( &rawtime ); timeinfo = localtime ( &rawtime );
strftime (timestr,sizeof(timestr),"%y-%m-%d %H:%M:%S",timeinfo); strftime (timestr,sizeof(timestr),"%y-%m-%d %H:%M:%S",timeinfo);
str_format(str, sizeof(str), "[%s][%s]: ", timestr, sys);
len = strlen(str); if(dbg_msg_threaded)
msg = (char *)str + len; {
lock_wait(log_queue.notfull);
lock_wait(log_queue.mutex);
int e = queue_empty(&log_queue);
va_start(args, fmt); str_format(log_queue.q[log_queue.end], sizeof(log_queue.q[log_queue.end]), "[%s][%s]: ", timestr, sys);
len = strlen(log_queue.q[log_queue.end]);
msg = (char *)log_queue.q[log_queue.end] + len;
va_start(args, fmt);
#if defined(CONF_FAMILY_WINDOWS) #if defined(CONF_FAMILY_WINDOWS)
_vsnprintf(msg, sizeof(str)-len, fmt, args); _vsnprintf(msg, sizeof(log_queue.q[log_queue.end])-len, fmt, args);
#else #else
vsnprintf(msg, sizeof(str)-len, fmt, args); vsnprintf(msg, sizeof(log_queue.q[log_queue.end])-len, fmt, args);
#endif #endif
va_end(args); va_end(args);
for(i = 0; i < num_loggers; i++) log_queue.end = (log_queue.end + 1) % QUEUE_SIZE;
loggers[i](str);
if(e)
lock_release(log_queue.notempty);
if(!queue_full(&log_queue))
lock_release(log_queue.notfull);
lock_release(log_queue.mutex);
}
else
{
char str[1024*4];
str_format(str, sizeof(str), "[%s][%s]: ", timestr, sys);
len = strlen(str);
msg = (char *)str + len;
va_start(args, fmt);
#if defined(CONF_FAMILY_WINDOWS)
_vsnprintf(msg, sizeof(str)-len, fmt, args);
#else
vsnprintf(msg, sizeof(str)-len, fmt, args);
#endif
va_end(args);
int i;
for(i = 0; i < num_loggers; i++)
loggers[i](str);
}
}
void dbg_msg_thread(void *v)
{
char str[1024*4];
while(1)
{
lock_wait(log_queue.notempty);
lock_wait(log_queue.mutex);
int f = queue_full(&log_queue);
str_copy(str, log_queue.q[log_queue.begin], sizeof(str));
log_queue.begin = (log_queue.begin + 1) % QUEUE_SIZE;
if(f)
lock_release(log_queue.notfull);
if(!queue_empty(&log_queue))
lock_release(log_queue.notempty);
lock_release(log_queue.mutex);
int i;
for(i = 0; i < num_loggers; i++)
loggers[i](str);
}
}
void dbg_enable_threaded()
{
Queue *q = &log_queue;
q->begin = 0;
q->end = 0;
q->mutex = lock_create();
q->notempty = lock_create();
q->notfull = lock_create();
lock_wait(q->notempty);
dbg_msg_threaded = 1;
void *Thread = thread_create(dbg_msg_thread, 0);
#if defined(CONF_FAMILY_UNIX)
pthread_detach((pthread_t)Thread);
#endif
} }
static void logger_stdout(const char *line) static void logger_stdout(const char *line)

View file

@ -1176,6 +1176,7 @@ void swap_endian(void *data, unsigned elem_size, unsigned num);
typedef void (*DBG_LOGGER)(const char *line); typedef void (*DBG_LOGGER)(const char *line);
void dbg_logger(DBG_LOGGER logger); void dbg_logger(DBG_LOGGER logger);
void dbg_enable_threaded();
void dbg_logger_stdout(); void dbg_logger_stdout();
void dbg_logger_debugger(); void dbg_logger_debugger();
void dbg_logger_file(const char *filename); void dbg_logger_file(const char *filename);

View file

@ -3045,6 +3045,8 @@ int main(int argc, const char **argv) // ignore_convention
} }
#endif #endif
dbg_enable_threaded();
CClient *pClient = CreateClient(); CClient *pClient = CreateClient();
IKernel *pKernel = IKernel::Create(); IKernel *pKernel = IKernel::Create();
pKernel->RegisterInterface(pClient); pKernel->RegisterInterface(pClient);

View file

@ -1964,6 +1964,7 @@ static CServer *CreateServer() { return new CServer(); }
int main(int argc, const char **argv) // ignore_convention int main(int argc, const char **argv) // ignore_convention
{ {
dbg_enable_threaded();
#if defined(CONF_FAMILY_WINDOWS) #if defined(CONF_FAMILY_WINDOWS)
for(int i = 1; i < argc; i++) // ignore_convention for(int i = 1; i < argc; i++) // ignore_convention
{ {