Kaydet (Commit) 7377aaa1 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Use rtl::Static

Change-Id: I391e027b2567c4239c1d02e132c6508b3f49d381
üst 388734a1
...@@ -49,48 +49,6 @@ using ::rtl::OUStringBuffer; ...@@ -49,48 +49,6 @@ using ::rtl::OUStringBuffer;
namespace { namespace {
static oslFileHandle g_aFile = 0;
static sal_Bool g_bHasBeenCalled = sal_False;
static const sal_Int32 g_BUFFERSIZE = 4096;
static sal_Char *g_buffer = 0;
class LoggerGuard
{
public:
~LoggerGuard();
};
LoggerGuard::~LoggerGuard()
{
if( g_buffer )
{
sal_Int64 nWritten, nConverted =
sprintf( g_buffer, "closing log file at %06" SAL_PRIuUINT32, osl_getGlobalTimer() );
if( nConverted > 0 )
osl_writeFile( g_aFile, g_buffer, nConverted, (sal_uInt64 *)&nWritten );
osl_closeFile( g_aFile );
g_aFile = 0;
rtl_freeMemory( g_buffer );
g_buffer = 0;
g_bHasBeenCalled = sal_False;
}
}
// The destructor of this static LoggerGuard is "activated" by the assignment to
// g_buffer in init():
LoggerGuard loggerGuard;
namespace
{
class theLogMutex : public rtl::Static<osl::Mutex, theLogMutex>{};
}
static Mutex & getLogMutex()
{
return theLogMutex::get();
}
OUString getFileUrl( const OUString &name ) OUString getFileUrl( const OUString &name )
{ {
OUString aRet; OUString aRet;
...@@ -108,124 +66,144 @@ OUString getFileUrl( const OUString &name ) ...@@ -108,124 +66,144 @@ OUString getFileUrl( const OUString &name )
return aRet; return aRet;
} }
void init() { static const sal_Int32 g_BUFFERSIZE = 4096;
if( !g_bHasBeenCalled )
struct Logger {
oslFileHandle aFile;
sal_Char *buffer;
osl::Mutex mutex;
Logger();
~Logger();
};
Logger::Logger(): aFile(0), buffer(0)
{
OUString name( "RTL_LOGFILE" );
OUString value;
if( rtl_bootstrap_get( name.pData, &value.pData, 0 ) )
{ {
MutexGuard guard( getLogMutex() ); // Obtain process id.
if( ! g_bHasBeenCalled ) oslProcessIdentifier aProcessId = 0;
oslProcessInfo info;
info.Size = sizeof (oslProcessInfo);
if (osl_getProcessInfo (0, osl_Process_IDENTIFIER, &info) == osl_Process_E_None)
aProcessId = info.Ident;
// Construct name of log file and open the file.
OUStringBuffer buf( 128 );
buf.append( value );
// if the filename ends with .nopid, the incoming filename is not modified
if( value.getLength() < 6 /* ".nopid" */ ||
rtl_ustr_ascii_compare_WithLength(
value.getStr() + (value.getLength()-6) , 6 , ".nopid" ) )
{ {
OUString name( "RTL_LOGFILE" ); buf.appendAscii( "_" );
OUString value; buf.append( (sal_Int32) aProcessId );
if( rtl_bootstrap_get( name.pData, &value.pData, 0 ) ) buf.appendAscii( ".log" );
{ }
// Obtain process id.
oslProcessIdentifier aProcessId = 0;
oslProcessInfo info;
info.Size = sizeof (oslProcessInfo);
if (osl_getProcessInfo (0, osl_Process_IDENTIFIER, &info) == osl_Process_E_None)
aProcessId = info.Ident;
// Construct name of log file and open the file.
OUStringBuffer buf( 128 );
buf.append( value );
// if the filename ends with .nopid, the incoming filename is not modified
if( value.getLength() < 6 /* ".nopid" */ ||
rtl_ustr_ascii_compare_WithLength(
value.getStr() + (value.getLength()-6) , 6 , ".nopid" ) )
{
buf.appendAscii( "_" );
buf.append( (sal_Int32) aProcessId );
buf.appendAscii( ".log" );
}
OUString o = getFileUrl( buf.makeStringAndClear() ); OUString o = getFileUrl( buf.makeStringAndClear() );
oslFileError e = osl_openFile( oslFileError e = osl_openFile(
o.pData, &g_aFile, osl_File_OpenFlag_Write|osl_File_OpenFlag_Create); o.pData, &aFile, osl_File_OpenFlag_Write|osl_File_OpenFlag_Create);
if( osl_File_E_None == e ) if( osl_File_E_None == e )
{ {
TimeValue aCurrentTime; TimeValue aCurrentTime;
g_buffer = ( sal_Char * ) rtl_allocateMemory( g_BUFFERSIZE ); buffer = ( sal_Char * ) rtl_allocateMemory( g_BUFFERSIZE );
sal_Int64 nConverted = 0; sal_Int64 nConverted = 0;
if (osl_getSystemTime (&aCurrentTime)) if (osl_getSystemTime (&aCurrentTime))
{ {
nConverted = (sal_Int64 ) sprintf ( nConverted = (sal_Int64 ) sprintf (
g_buffer, buffer,
"opening log file %f seconds past January 1st 1970\n" "opening log file %f seconds past January 1st 1970\n"
"corresponding to %" SAL_PRIuUINT32 " ms after timer start\n", "corresponding to %" SAL_PRIuUINT32 " ms after timer start\n",
aCurrentTime.Seconds + 1e-9 * aCurrentTime.Nanosec, aCurrentTime.Seconds + 1e-9 * aCurrentTime.Nanosec,
osl_getGlobalTimer()); osl_getGlobalTimer());
if( nConverted > 0 ) if( nConverted > 0 )
{
sal_Int64 nWritten;
osl_writeFile( g_aFile, g_buffer, nConverted , (sal_uInt64 *)&nWritten );
}
}
nConverted = sprintf (g_buffer, "Process id is %" SAL_PRIuUINT32 "\n", aProcessId);
if( nConverted )
{
sal_Int64 nWritten;
osl_writeFile( g_aFile, g_buffer, nConverted, (sal_uInt64 *)&nWritten );
}
}
else
{ {
SAL_WARN( sal_Int64 nWritten;
"sal.rtl", osl_writeFile( aFile, buffer, nConverted , (sal_uInt64 *)&nWritten );
"Couldn't open logfile " << o << '(' << +e << ')');
} }
} }
g_bHasBeenCalled = sal_True;
nConverted = sprintf (buffer, "Process id is %" SAL_PRIuUINT32 "\n", aProcessId);
if( nConverted )
{
sal_Int64 nWritten;
osl_writeFile( aFile, buffer, nConverted, (sal_uInt64 *)&nWritten );
}
}
else
{
SAL_WARN(
"sal.rtl",
"Couldn't open logfile " << o << '(' << +e << ')');
} }
} }
} }
Logger::~Logger()
{
if( buffer )
{
sal_Int64 nWritten, nConverted =
sprintf( buffer, "closing log file at %06" SAL_PRIuUINT32, osl_getGlobalTimer() );
if( nConverted > 0 )
osl_writeFile( aFile, buffer, nConverted, (sal_uInt64 *)&nWritten );
osl_closeFile( aFile );
rtl_freeMemory( buffer );
}
}
struct theLogger: public rtl::Static<Logger, theLogger> {};
} }
extern "C" void SAL_CALL rtl_logfile_trace ( const char *pszFormat, ... ) extern "C" void SAL_CALL rtl_logfile_trace ( const char *pszFormat, ... )
{ {
init(); Logger & logger = theLogger::get();
if( g_buffer ) if( logger.buffer )
{ {
va_list args; va_list args;
va_start(args, pszFormat); va_start(args, pszFormat);
{ {
sal_Int64 nConverted, nWritten; sal_Int64 nConverted, nWritten;
MutexGuard guard( getLogMutex() ); MutexGuard guard( logger.mutex );
nConverted = vsnprintf( g_buffer , g_BUFFERSIZE, pszFormat, args ); nConverted = vsnprintf( logger.buffer , g_BUFFERSIZE, pszFormat, args );
nConverted = (nConverted > g_BUFFERSIZE ? g_BUFFERSIZE : nConverted ); nConverted = (nConverted > g_BUFFERSIZE ? g_BUFFERSIZE : nConverted );
if( nConverted > 0 ) if( nConverted > 0 )
osl_writeFile( g_aFile, g_buffer, nConverted, (sal_uInt64*)&nWritten ); osl_writeFile( logger.aFile, logger.buffer, nConverted, (sal_uInt64*)&nWritten );
} }
va_end(args); va_end(args);
} }
} }
extern "C" void SAL_CALL rtl_logfile_longTrace(char const * format, ...) { extern "C" void SAL_CALL rtl_logfile_longTrace(char const * format, ...) {
init(); Logger & logger = theLogger::get();
if (g_buffer != 0) { if (logger.buffer != 0) {
sal_uInt32 time = osl_getGlobalTimer(); sal_uInt32 time = osl_getGlobalTimer();
oslThreadIdentifier threadId = osl::Thread::getCurrentIdentifier(); oslThreadIdentifier threadId = osl::Thread::getCurrentIdentifier();
va_list args; va_list args;
va_start(args, format); va_start(args, format);
{ {
MutexGuard g(getLogMutex()); MutexGuard g(logger.mutex);
int n1 = snprintf( int n1 = snprintf(
g_buffer, g_BUFFERSIZE, "%06" SAL_PRIuUINT32 " %" SAL_PRIuUINT32 " ", time, threadId); logger.buffer, g_BUFFERSIZE, "%06" SAL_PRIuUINT32 " %" SAL_PRIuUINT32 " ", time, threadId);
if (n1 >= 0) { if (n1 >= 0) {
sal_uInt64 n2; sal_uInt64 n2;
osl_writeFile( osl_writeFile(
g_aFile, g_buffer, logger.aFile, logger.buffer,
static_cast< sal_uInt64 >( static_cast< sal_uInt64 >(
std::min(n1, static_cast< int >(g_BUFFERSIZE))), std::min(n1, static_cast< int >(g_BUFFERSIZE))),
&n2); &n2);
n1 = vsnprintf(g_buffer, g_BUFFERSIZE, format, args); n1 = vsnprintf(logger.buffer, g_BUFFERSIZE, format, args);
if (n1 > 0) { if (n1 > 0) {
osl_writeFile( osl_writeFile(
g_aFile, g_buffer, logger.aFile, logger.buffer,
static_cast< sal_uInt64 >( static_cast< sal_uInt64 >(
std::min(n1, static_cast< int >(g_BUFFERSIZE))), std::min(n1, static_cast< int >(g_BUFFERSIZE))),
&n2); &n2);
...@@ -237,8 +215,7 @@ extern "C" void SAL_CALL rtl_logfile_longTrace(char const * format, ...) { ...@@ -237,8 +215,7 @@ extern "C" void SAL_CALL rtl_logfile_longTrace(char const * format, ...) {
} }
extern "C" sal_Bool SAL_CALL rtl_logfile_hasLogFile( void ) { extern "C" sal_Bool SAL_CALL rtl_logfile_hasLogFile( void ) {
init(); return theLogger::get().buffer != 0;
return g_buffer != 0;
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment