From: Art Cancro Date: Fri, 23 Jul 2010 20:23:18 +0000 (+0000) Subject: * Rewrote vCtdlLogPrintf() to NOT use any buffers at all, only v*printf() type functi... X-Git-Tag: v8.01~1012 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=24ea4a1892e55b393ba75add798c7e9e3fd64cbc * Rewrote vCtdlLogPrintf() to NOT use any buffers at all, only v*printf() type functions. We do this by writing the log data and metadata in separate calls. In practice, this will cause them to appear on the same line even when other threads are concurrently writing because we are using buffered I/O. Unfortunately, this does NOT fix the server crash that occurs when saving instant message transcripts to disk. It points us in the right direction, though. --- diff --git a/citadel/context.c b/citadel/context.c index 5f964be4a..06615b7e2 100644 --- a/citadel/context.c +++ b/citadel/context.c @@ -345,7 +345,6 @@ void RemoveContext (CitContext *con) FreeStrBuf(&con->MigrateBuf); FreeStrBuf(&con->ReadBuf); - FreeStrBuf(&con->lBuf); CtdlLogPrintf(CTDL_DEBUG, "Done with RemoveContext()\n"); } @@ -368,7 +367,6 @@ CitContext *CreateNewContext(void) { return NULL; } memset(me, 0, sizeof(CitContext)); - me->lBuf = NewStrBufPlain(NULL, SIZ); /* Give the contaxt a name. Hopefully makes it easier to track */ strcpy (me->user.fullname, "SYS_notauth"); @@ -435,7 +433,6 @@ void CtdlFillSystemContext(CitContext *context, char *name) long len; memset(context, 0, sizeof(CitContext)); - context->lBuf = NewStrBuf(); context->internal_pgm = 1; context->cs_pid = 0; strcpy (sysname, "SYS_"); @@ -466,7 +463,6 @@ void CtdlClearSystemContext(void) { CitContext *CCC = CC; - FreeStrBuf(&CCC->lBuf); memset(CCC, 0, sizeof(CitContext)); citthread_setspecific(MyConKey, NULL); } @@ -594,7 +590,6 @@ void InitializeMasterCC(void) { memset(&masterCC, 0, sizeof( CitContext)); masterCC.internal_pgm = 1; masterCC.cs_pid = 0; - masterCC.lBuf = NewStrBuf (); } diff --git a/citadel/context.h b/citadel/context.h index 322061e65..7a71d3b96 100644 --- a/citadel/context.h +++ b/citadel/context.h @@ -28,8 +28,6 @@ struct CitContext { int state; /* thread state (see CON_ values below) */ int kill_me; /* Set to nonzero to flag for termination */ - StrBuf *lBuf; - const char *Pos; /* Our read position inside of the ReadBuf */ StrBuf *ReadBuf; /* Our block buffered read buffer */ StrBuf *MigrateBuf; /* Our block buffered read buffer */ diff --git a/citadel/sysdep.c b/citadel/sysdep.c index 963af9df6..9dce3a3ae 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -120,78 +120,47 @@ void vCtdlLogPrintf(enum LogLevel loglevel, const char *format, va_list arg_ptr) struct timeval tv; struct tm tim; time_t unixtime; - StrBuf *lBuf; CitContext *CCC = CC; ThreadTSD *cTSD = CTP; CtdlThreadNode *node = NULL; long lwpid = 0; - if (cTSD != NULL) + if (cTSD != NULL) { node = cTSD->self; - if ((node != NULL) && (node->reltid != 0)) - { + } + + if ((node != NULL) && (node->reltid != 0)) { lwpid = node->reltid; } gettimeofday(&tv, NULL); + /* Promote to time_t; types differ on some OSes (like darwin) */ unixtime = tv.tv_sec; localtime_r(&unixtime, &tim); - if ((CCC != NULL) && (CCC != &masterCC)) - lBuf = CCC->lBuf; - else - lBuf = NewStrBuf(); - if (lBuf == NULL) { - char buf[SIZ], buf2[SIZ]; - - if ((CCC != NULL) && (CCC->cs_pid != 0)) { - sprintf(buf, - "%04d/%02d/%02d %2d:%02d:%02d.%06ld xx [%3d] ", - tim.tm_year + 1900, tim.tm_mon + 1, - tim.tm_mday, tim.tm_hour, tim.tm_min, - tim.tm_sec, (long)tv.tv_usec, - CCC->cs_pid); - } else { - sprintf(buf, - "%04d/%02d/%02d %2d:%02d:%02d.%06ld xx ", - tim.tm_year + 1900, tim.tm_mon + 1, - tim.tm_mday, tim.tm_hour, tim.tm_min, - tim.tm_sec, (long)tv.tv_usec); - } - vsnprintf(buf2, SIZ, format, arg_ptr); + fprintf(stderr, + "%04d/%02d/%02d %2d:%02d:%02d.%06ld ", + tim.tm_year + 1900, tim.tm_mon + 1, + tim.tm_mday, tim.tm_hour, tim.tm_min, + tim.tm_sec, (long)tv.tv_usec + ); - fprintf(stderr, ":%s%s", buf, buf2); + if (lwpid != 0) { + fprintf(stderr, "[LWP:%ld] ", lwpid); } - else { - StrBufPrintf(lBuf, - "%04d/%02d/%02d %2d:%02d:%02d.%06ld ", - tim.tm_year + 1900, tim.tm_mon + 1, - tim.tm_mday, tim.tm_hour, tim.tm_min, - tim.tm_sec, (long)tv.tv_usec); - - if (lwpid != 0) - StrBufAppendPrintf(lBuf, - "[LWP:%d] ", - lwpid); - - if (CCC != NULL) { - if (CCC->cs_pid != 0) - StrBufAppendPrintf(lBuf, - "[%3d] ", - CCC->cs_pid); - else if (CCC->user.usernum != 0) - StrBufAppendPrintf(lBuf, - "[:%d] ", - CCC->user.usernum); + if (CCC != NULL) { + if (CCC->cs_pid != 0) { + fprintf(stderr, "[%3d] ", CCC->cs_pid); + } + else if (CCC->user.usernum != 0) { + fprintf(stderr, "[:%ld] ", CCC->user.usernum); } - StrBufVAppendPrintf(lBuf, format, arg_ptr); - fwrite(ChrPtr(lBuf), 1, StrLength(lBuf), stderr); } - fflush(stderr); - if (CCC == NULL) FreeStrBuf(&lBuf); + vfprintf(stderr, format, arg_ptr); + fflush(stderr); } }