From: <chi...@us...> - 2003-06-15 03:18:54
|
Update of /cvsroot/log4cocoa/log4cocoa In directory sc8-pr-cvs1:/tmp/cvs-serv2301 Modified Files: L4Logger.h L4Logger.m L4LoggerStore.h L4LoggerStore.m Log Message: started to add NSLocks to make Log4Cocoa thread safe, but backed out and commented all locks for now, I'm goingn to focus on other things for now getting ready for WWDC. I will look for a multi-threading expert later. Index: L4Logger.h =================================================================== RCS file: /cvsroot/log4cocoa/log4cocoa/L4Logger.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- L4Logger.h 7 May 2003 07:16:40 -0000 1.3 +++ L4Logger.h 15 Jun 2003 03:18:52 -0000 1.4 @@ -69,6 +69,26 @@ #define L4LogFatal L4_LOCATION fatal #define L4LogAssert L4_LOCATION assert +#define log4Debug(message) if([[self logger] isDebugEnabled]) [[self logger] L4LogDebug: message] +#define log4Info(message) if([[self logger] isInfoEnabled]) [[self logger] L4LogInfo: message] +#define log4Warn(message) [[self logger] L4LogWarn: message] +#define log4error(message) [[self logger] L4LogError: message] +#define log4fatal(message) [[self logger] L4LogFatal: message] + +#define log4DebugWithException(message, e) if([[self logger] isDebugEnabled]) [[self logger] L4LogDebug: message exception: e] +#define log4InfoWithException(message, e) if([[self logger] isInfoEnabled]) [[self logger] L4LogInfo: message exception: e] +#define log4WarnWithException(message, e) [[self logger] L4LogWarn: message exception: e] +#define log4ErrorWithException(message, e) [[self logger] L4LogError: message exception: e] +#define log4FatalWithException(message, e) [[self logger] L4LogFatal: message exception: e] + +#define log4Assert(assertion, message) [[self logger] L4LogAssert: assertion log: message] + +/***** + * NOTE: THESE FOLLOWING MACROS WILL GO AWAY IN 1.0. THEY ARE JUST BEING KEPT AROUND FOR + * TEMPORARY COMATIBILITY REASONS WITH EARLIER PRE-BETA VERSIONS. + */ +#warning "REMEMBER TO DELETE COMPATIBLITY MACROS IN L4Logger.h" +// #define L4Debug(message) if([[self logger] isDebugEnabled]) [[self logger] L4LogDebug: message] #define L4Info(message) if([[self logger] isInfoEnabled]) [[self logger] L4LogInfo: message] #define L4Warn(message) [[self logger] L4LogWarn: message] @@ -84,6 +104,7 @@ #define L4Assert(assertion, message) [[self logger] L4LogAssert: assertion log: message] + @class L4AppenderAttachableImpl; @interface L4Logger : NSObject { @@ -94,6 +115,8 @@ BOOL additive; L4AppenderAttachableImpl *aai; } + ++ (void) taskNowMultiThreaded: (NSNotification *) event; // DON'T USE, only for use of log manager - (id) initWithName: (NSString *) loggerName; Index: L4Logger.m =================================================================== RCS file: /cvsroot/log4cocoa/log4cocoa/L4Logger.m,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- L4Logger.m 7 May 2003 07:16:40 -0000 1.5 +++ L4Logger.m 15 Jun 2003 03:18:52 -0000 1.6 @@ -40,6 +40,7 @@ static L4Level *_warn = nil; static L4Level *_info = nil; static L4Level *_debug = nil; +static NSLock *_loggerLock = nil; @implementation L4Logger @@ -56,8 +57,26 @@ _warn = [L4Level warn]; _error = [L4Level error]; _fatal = [L4Level fatal]; + + if ([NSThread isMultiThreaded]) { + [self taskNowMultiThreaded: nil]; + } else { + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector(taskNowMultiThreaded:) + name: NSWillBecomeMultiThreadedNotification + object: nil]; + } } ++ (void) taskNowMultiThreaded: (NSNotification *) event { + if (!_loggerLock) { + _loggerLock = [[NSLock alloc] init]; + // we can add other things here. + } +} + + + - init { return nil; // never use this constructor @@ -211,6 +230,8 @@ L4Logger *aLogger = self; int writes = 0; +// [_loggerLock lock]; // ### LOCKING + for( aLogger = self; aLogger != nil; aLogger = [aLogger parent] ) { if( [aLogger aai] != nil ) @@ -223,6 +244,8 @@ } } +// [_loggerLock unlock]; // ### LOCKING + if( writes == 0 ) { [repository emitNoAppenderWarning: self]; @@ -250,14 +273,16 @@ return [aai appenderWithName: aName]; } -- (void) addAppender: (id <L4Appender>) appender // SYNCHRONIZED ???? +- (void) addAppender: (id <L4Appender>) appender // SYNCHRONIZED { +// [_loggerLock lock]; // ### LOCKING if( aai == nil ) { aai = [[L4AppenderAttachableImpl alloc] init]; } [aai addAppender: appender]; +// [_loggerLock unlock]; // ### LOCKING } - (BOOL) isAttached: (id <L4Appender>) appender @@ -290,26 +315,34 @@ // it should implement the L4AppenderAttachable protocol // weird?!?!?! // +// [_loggerLock lock]; // ### LOCKING [anObject close]; +// [_loggerLock unlock]; // ### LOCKING } } } - (void) removeAllAppenders { +// [_loggerLock lock]; // ### LOCKING [aai removeAllAppenders]; [aai release]; aai = nil; +// [_loggerLock unlock]; // ### LOCKING } - (void) removeAppender: (id <L4Appender>) appender { +// [_loggerLock lock]; // ### LOCKING [aai removeAppender: appender]; +// [_loggerLock unlock]; // ### LOCKING } - (void) removeAppenderWithName: (NSString *) aName { +// [_loggerLock lock]; // ### LOCKING [aai removeAppenderWithName: aName]; +// [_loggerLock unlock]; // ### LOCKING } @end Index: L4LoggerStore.h =================================================================== RCS file: /cvsroot/log4cocoa/log4cocoa/L4LoggerStore.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- L4LoggerStore.h 7 May 2003 07:16:40 -0000 1.2 +++ L4LoggerStore.h 15 Jun 2003 03:18:52 -0000 1.3 @@ -51,6 +51,12 @@ BOOL emittedNoResourceBundleWarning; } +/******** + * enables thread locking, no need to lock if not mulit-threaded. + */ ++ (void) taskNowMultiThreaded: (NSNotification *) event; + + /******* * the following are L4LoggerRepository methods */ Index: L4LoggerStore.m =================================================================== RCS file: /cvsroot/log4cocoa/log4cocoa/L4LoggerStore.m,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- L4LoggerStore.m 7 May 2003 07:16:40 -0000 1.4 +++ L4LoggerStore.m 15 Jun 2003 03:18:52 -0000 1.5 @@ -36,6 +36,9 @@ #import <objc/objc-class.h> +static NSLock *_storeLock = nil; + + @interface L4LoggerStore (Private) - (NSString *) pseudoFqcnForClass: (Class) aClass; @@ -50,6 +53,24 @@ @implementation L4LoggerStore ++ (void) initialize { + if ([NSThread isMultiThreaded]) { + [self taskNowMultiThreaded: nil]; + } else { + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector(taskNowMultiThreaded:) + name: NSWillBecomeMultiThreadedNotification + object: nil]; + } +} + ++ (void) taskNowMultiThreaded: (NSNotification *) event { + if (!_storeLock) { + _storeLock = [[NSLock alloc] init]; + // we can add other things here. + } +} + - (id) init { // ### todo ??? [self autorelease]; @@ -155,8 +176,10 @@ // save the logger with a class as its key // +// [_storeLock lock]; // ### LOCKING [repository setObject: theLogger forKey: aClass]; +// [_storeLock unlock]; // ### LOCKING } return theLogger; } @@ -176,7 +199,11 @@ factory: (id <L4LoggerFactory>) aFactory { L4Logger *theLogger = nil; - id theNode = [repository objectForKey: aName]; + id theNode; + +// [_storeLock lock]; // ### LOCKING + theNode = [repository objectForKey: aName]; +// [_storeLock unlock]; // ### LOCKING // ### -- TODO? - enable ifdef for compiling out ???? // #ifdef LOG4COCOA_DISABLED @@ -185,6 +212,8 @@ if( theNode == nil ) { +// [_storeLock lock]; // ### LOCKING + // // if the node is nil, then its a new logger & therefore // a new leaf node, since no placeholder node was found. // @@ -194,6 +223,8 @@ forKey: aName]; [self updateParentsOfLogger: theLogger]; [loggers addObject: theLogger]; + +// [_storeLock unlock]; // ### LOCKING } else if([theNode isKindOfClass: [L4Logger class]]) { @@ -201,6 +232,8 @@ } else if([theNode isKindOfClass: [NSMutableArray class]]) { +// [_storeLock lock]; // ### LOCKING + // // this node is a placeholder middle node, since its // an NSMutableArray. It contains children and // a parent, so when we insert this logger, we need @@ -215,6 +248,8 @@ withParent: theLogger ]; [self updateParentsOfLogger: theLogger]; [loggers addObject: theLogger]; + +// [_storeLock lock]; // ### LOCKING } else { |