make all the log functions/structs/enums use a single 'tr_log' namespace, such as tr_logGetQueue, tr_logAddInfo, tr_logIsLevelActive

This commit is contained in:
Jordan Lee
2013-01-25 23:34:20 +00:00
parent 5af4abfc82
commit f75027d5e9
56 changed files with 888 additions and 718 deletions
+9 -258
View File
@@ -56,129 +56,19 @@
#include "fdlimit.h"
#include "ConvertUTF.h"
#include "list.h"
#include "log.h"
#include "utils.h"
#include "platform.h" /* tr_lockLock (), TR_PATH_MAX */
#include "variant.h"
#include "version.h"
time_t __tr_current_time = 0;
tr_msg_level __tr_message_level = TR_MSG_ERR;
static bool messageQueuing = false;
static tr_msg_list * messageQueue = NULL;
static tr_msg_list ** messageQueueTail = &messageQueue;
static int messageQueueCount = 0;
#ifndef WIN32
/* make null versions of these win32 functions */
static inline int IsDebuggerPresent (void) { return false; }
static inline void OutputDebugString (const void * unused UNUSED) { }
#endif
time_t __tr_current_time = 0;
/***
****
***/
static tr_lock*
getMessageLock (void)
{
static tr_lock * l = NULL;
if (!l)
l = tr_lockNew ();
return l;
}
void*
tr_getLog (void)
{
static bool initialized = false;
static FILE * file = NULL;
if (!initialized)
{
int fd = 0;
const char * str = getenv ("TR_DEBUG_FD");
if (str && *str)
fd = atoi (str);
switch (fd)
{
case 1:
file = stdout;
break;
case 2:
file = stderr;
break;
default:
file = NULL;
break;
}
initialized = true;
}
return file;
}
void
tr_setMessageLevel (tr_msg_level level)
{
__tr_message_level = level;
}
void
tr_setMessageQueuing (bool enabled)
{
messageQueuing = enabled;
}
bool
tr_getMessageQueuing (void)
{
return messageQueuing != 0;
}
tr_msg_list *
tr_getQueuedMessages (void)
{
tr_msg_list * ret;
tr_lockLock (getMessageLock ());
ret = messageQueue;
messageQueue = NULL;
messageQueueTail = &messageQueue;
messageQueueCount = 0;
tr_lockUnlock (getMessageLock ());
return ret;
}
void
tr_freeMessageList (tr_msg_list * list)
{
tr_msg_list * next;
while (NULL != list)
{
next = list->next;
free (list->message);
free (list->name);
free (list);
list = next;
}
}
/**
***
**/
struct tm *
tr_localtime_r (const time_t *_clock, struct tm *_result)
{
@@ -192,145 +82,6 @@ tr_localtime_r (const time_t *_clock, struct tm *_result)
#endif
}
char*
tr_getLogTimeStr (char * buf, int buflen)
{
char tmp[64];
struct tm now_tm;
struct timeval tv;
time_t seconds;
int milliseconds;
gettimeofday (&tv, NULL);
seconds = tv.tv_sec;
tr_localtime_r (&seconds, &now_tm);
strftime (tmp, sizeof (tmp), "%H:%M:%S", &now_tm);
milliseconds = tv.tv_usec / 1000;
tr_snprintf (buf, buflen, "%s.%03d", tmp, milliseconds);
return buf;
}
bool
tr_deepLoggingIsActive (void)
{
static int8_t deepLoggingIsActive = -1;
if (deepLoggingIsActive < 0)
deepLoggingIsActive = IsDebuggerPresent () || (tr_getLog ()!=NULL);
return deepLoggingIsActive != 0;
}
void
tr_deepLog (const char * file,
int line,
const char * name,
const char * fmt,
...)
{
FILE * fp = tr_getLog ();
if (fp || IsDebuggerPresent ())
{
va_list args;
char timestr[64];
char * message;
struct evbuffer * buf = evbuffer_new ();
char * base = tr_basename (file);
evbuffer_add_printf (buf, "[%s] ",
tr_getLogTimeStr (timestr, sizeof (timestr)));
if (name)
evbuffer_add_printf (buf, "%s ", name);
va_start (args, fmt);
evbuffer_add_vprintf (buf, fmt, args);
va_end (args);
evbuffer_add_printf (buf, " (%s:%d)\n", base, line);
/* FIXME (libevent2) ifdef this out for nonwindows platforms */
message = evbuffer_free_to_str (buf);
OutputDebugString (message);
if (fp)
fputs (message, fp);
tr_free (message);
tr_free (base);
}
}
/***
****
***/
void
tr_msg (const char * file, int line,
tr_msg_level level,
const char * name,
const char * fmt, ...)
{
const int err = errno; /* message logging shouldn't affect errno */
char buf[1024];
va_list ap;
tr_lockLock (getMessageLock ());
/* build the text message */
*buf = '\0';
va_start (ap, fmt);
evutil_vsnprintf (buf, sizeof (buf), fmt, ap);
va_end (ap);
OutputDebugString (buf);
if (*buf)
{
if (messageQueuing)
{
tr_msg_list * newmsg;
newmsg = tr_new0 (tr_msg_list, 1);
newmsg->level = level;
newmsg->when = tr_time ();
newmsg->message = tr_strdup (buf);
newmsg->file = file;
newmsg->line = line;
newmsg->name = tr_strdup (name);
*messageQueueTail = newmsg;
messageQueueTail = &newmsg->next;
++messageQueueCount;
if (messageQueueCount > TR_MAX_MSG_LOG)
{
tr_msg_list * old = messageQueue;
messageQueue = old->next;
old->next = NULL;
tr_freeMessageList (old);
--messageQueueCount;
assert (messageQueueCount == TR_MAX_MSG_LOG);
}
}
else
{
FILE * fp;
char timestr[64];
fp = tr_getLog ();
if (fp == NULL)
fp = stderr;
tr_getLogTimeStr (timestr, sizeof (timestr));
if (name)
fprintf (fp, "[%s] %s: %s\n", timestr, name, buf);
else
fprintf (fp, "[%s] %s\n", timestr, buf);
fflush (fp);
}
}
tr_lockUnlock (getMessageLock ());
errno = err;
}
/***
****
***/
@@ -446,14 +197,14 @@ tr_loadFile (const char * path,
if (stat (path, &sb))
{
const int err = errno;
tr_dbg (err_fmt, path, tr_strerror (errno));
tr_logAddDebug (err_fmt, path, tr_strerror (errno));
errno = err;
return NULL;
}
if ((sb.st_mode & S_IFMT) != S_IFREG)
{
tr_err (err_fmt, path, _("Not a regular file"));
tr_logAddError (err_fmt, path, _("Not a regular file"));
errno = EISDIR;
return NULL;
}
@@ -463,7 +214,7 @@ tr_loadFile (const char * path,
if (fd < 0)
{
const int err = errno;
tr_err (err_fmt, path, tr_strerror (errno));
tr_logAddError (err_fmt, path, tr_strerror (errno));
errno = err;
return NULL;
}
@@ -471,7 +222,7 @@ tr_loadFile (const char * path,
if (!buf)
{
const int err = errno;
tr_err (err_fmt, path, _("Memory allocation failed"));
tr_logAddError (err_fmt, path, _("Memory allocation failed"));
tr_close_file (fd);
errno = err;
return NULL;
@@ -480,7 +231,7 @@ tr_loadFile (const char * path,
if (n == -1)
{
const int err = errno;
tr_err (err_fmt, path, tr_strerror (errno));
tr_logAddError (err_fmt, path, tr_strerror (errno));
tr_close_file (fd);
free (buf);
errno = err;
@@ -579,7 +330,7 @@ tr_mkdirp (const char * path_in,
if (tr_mkdir (path, permissions))
{
tmperr = errno;
tr_err (_("Couldn't create \"%1$s\": %2$s"), path, tr_strerror (tmperr));
tr_logAddError (_("Couldn't create \"%1$s\": %2$s"), path, tr_strerror (tmperr));
tr_free (path);
errno = tmperr;
return -1;
@@ -589,7 +340,7 @@ tr_mkdirp (const char * path_in,
{
/* Node exists but isn't a folder */
char * buf = tr_strdup_printf (_("File \"%s\" is in the way"), path);
tr_err (_("Couldn't create \"%1$s\": %2$s"), path_in, buf);
tr_logAddError (_("Couldn't create \"%1$s\": %2$s"), path_in, buf);
tr_free (buf);
tr_free (path);
errno = ENOTDIR;