blob: a7c3a1e4ba8c7b7e26060cf6681de604ca26b3ee [file] [log] [blame]
//
// GTMLoggerRingBufferWriter.h
//
// Copyright 2007-2008 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
//
#import "GTMLogger.h"
#import "GTMDefines.h"
typedef struct GTMRingBufferPair GTMRingBufferPair;
// GTMLoggerRingBufferWriter is a GTMLogWriter that accumulates logged Info
// and Debug messages (when they're not compiled out in a release build)
// into a ring buffer. If an Error or Assert message is
// logged, all of the previously logged messages (up to the size of the
// buffer) are then logged. At that point the buffer resets itself.
//
// How to use:
//
// * Create a logger writer that you want to use to do the ultimate writing,
// such as to stdErr, or a log file, or an NSArray that aggregates other
// writers.
// id<GTMLoggerWriter> someWriter = ...
//
// * Make a new ring buffer with this writer, along with the buffer's
// capacity (which must be >= 1):
// rbw =
// [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:32
// writer:someWriter];
//
// * Set your logger's writer to be the ring buffer writer:
// [[GTMLogger sharedLogger] setWriter:rbw];
//
// Note that this writer is at the end of the GTMLogger food chain, where the
// default filter removes Info messages in Release mode (Debug messages are
// compiled out). You can pass nil to GTMLogger's -setFilter to have it pass
// along all the messages.
//
@interface GTMLoggerRingBufferWriter : NSObject <GTMLogWriter> {
@private
id<GTMLogWriter> writer_;
GTMRingBufferPair *buffer_;
NSUInteger capacity_;
NSUInteger nextIndex_; // Index of the next element of |buffer_| to fill.
NSUInteger totalLogged_; // This > 0 and |nextIndex_| == 0 means we've wrapped.
}
// Returns an autoreleased ring buffer writer. If |writer| is nil,
// then nil is returned.
+ (id)ringBufferWriterWithCapacity:(NSUInteger)capacity
writer:(id<GTMLogWriter>)loggerWriter;
// Designated initializer. If |writer| is nil, then nil is returned.
// If you just use -init, nil will be returned.
- (id)initWithCapacity:(NSUInteger)capacity
writer:(id<GTMLogWriter>)loggerWriter;
// How many messages will be logged before older messages get dropped
// on the floor.
- (NSUInteger)capacity;
// The log writer that will get the buffered log messages if/when they
// need to be displayed.
- (id<GTMLogWriter>)writer;
// How many log messages are currently in the buffer.
- (NSUInteger)count;
// How many have been dropped on the floor since creation, or the last
// reset.
- (NSUInteger)droppedLogCount;
// The total number of messages processed since creation, or the last
// reset.
- (NSUInteger)totalLogged;
// Purge the contents and reset the counters.
- (void)reset;
// Print out the contents without resetting anything.
// Contents are automatically printed and reset when an error-level
// message comes through.
- (void)dumpContents;
@end // GTMLoggerRingBufferWriter