static void pumpLogMessages( FILE * logfile ) { const tr_msg_list * l; tr_msg_list * list = tr_getQueuedMessages( ); for( l=list; l!=NULL; l=l->next ) printMessage( logfile, l->level, l->name, l->message, l->file, l->line ); tr_freeMessageList( list ); }
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 { char timestr[64]; FILE * fp; 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; }