module xdc.runtime.LoggerBuf

A logger which stores Log events in a buffer

This module provides a logger which captures Log events to a buffer in realtime. The Log events stored in the buffer are unformatted; Log event formatting is deferred until some client reads the raw event data from the buffer. You can use LoggerBuf_flush() to process the Log events stored in the buffer and stream the formatted output to stdout (via System.printf). Alternatively, you can read a raw event (via getNextEntry) and send it to another client that has the resources to format the event for display. [ more ... ]
XDCspec summary sourced in xdc/runtime/LoggerBuf.xdc
@Gated @ModuleStartup
module LoggerBuf {  ...
// inherits xdc.runtime.ILogger
    // inherits xdc.runtime.IModule
instance:  ...
C synopsis target-domain
#include <xdc/runtime/LoggerBuf.h>
module-wide constants & types
    } LoggerBuf_BufType;
module-wide config parameters
module-wide functions
module-wide built-ins
per-instance object types
 
per-instance config parameters
        IInstance_Params *instance;
        Bool exitFlush// Flush log at system exit;
    } LoggerBuf_Params;
 
per-instance creation
per-instance deletion
per-instance functions
    Void LoggerBuf_write4// Process a log event with up to 4 arguments( LoggerBuf_Handle handle, Types_Event evt, IArg a1, IArg a2, IArg a3, IArg a4 );
    Void LoggerBuf_write8// Process a log event with up to 8 arguments( LoggerBuf_Handle handle, Types_Event evt, IArg a1, IArg a2, IArg a3, IArg a4, IArg a5, IArg a6, IArg a7, IArg a8 );
per-instance convertors
per-instance built-ins
 
XDCscript usage meta-domain
var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
local proxy modules
        LoggerBuf.TimestampProxy.delegate$ = ITimestampClient.Module null
module-wide constants & types
 
    var obj = new LoggerBuf.BasicView// ;
        obj.label = String  ...
        obj.lastSerial = Int  ...
        obj.enabledFlag = Bool  ...
 
    var obj = new LoggerBuf.RecordView// ;
        obj.serial = Int  ...
        obj.timestamp = Int  ...
        obj.modName = String  ...
        obj.text = String  ...
        obj.eventId = Int  ...
        obj.eventName = String  ...
        obj.arg0 = IArg  ...
        obj.arg1 = IArg  ...
        obj.arg2 = IArg  ...
        obj.arg3 = IArg  ...
module-wide config parameters
 
per-instance config parameters
    var params = new LoggerBuf.Params// Instance config-params object;
        params.exitFlush// Flush log at system exit = Bool false;
        params.numEntries// Number of entries in buffer = Int 64;
per-instance creation
    var inst = LoggerBuf.create// Create an instance-object( params );
 
XDCspec declarations sourced in xdc/runtime/LoggerBuf.xdc
package xdc.runtime;
 
@Gated @ModuleStartup
module LoggerBuf inherits ILogger {
local proxy modules
    proxy TimestampProxy inherits ITimestampClient;
module-wide constants & types
    };
 
    metaonly struct BasicView//  {
        String label;
        Int lastSerial;
        Bool enabledFlag;
    };
 
    metaonly struct RecordView//  {
        Int serial;
        Int timestamp;
        String modName;
        String text;
        Int eventId;
        String eventName;
        IArg arg0;
        IArg arg1;
        IArg arg2;
        IArg arg3;
    };
module-wide config parameters
    config Bool enableFlush// Flush all logs at system exit = false;
 
module-wide functions
 
 
instance:
per-instance config parameters
    config Bool exitFlush// Flush log at system exit = false;
    config Int numEntries// Number of entries in buffer = 64;
 
per-instance creation
per-instance functions
    Bool disable// Disable a log( );
    Bool enable// Enable a log( );
    Void write4// Process a log event with up to 4 arguments( Types.Event evt, IArg a1, IArg a2, IArg a3, IArg a4 );
    Void write8// Process a log event with up to 8 arguments( Types.Event evt, IArg a1, IArg a2, IArg a3, IArg a4, IArg a5, IArg a6, IArg a7, IArg a8 );
}
DETAILS
This module provides a logger which captures Log events to a buffer in realtime. The Log events stored in the buffer are unformatted; Log event formatting is deferred until some client reads the raw event data from the buffer. You can use LoggerBuf_flush() to process the Log events stored in the buffer and stream the formatted output to stdout (via System.printf). Alternatively, you can read a raw event (via getNextEntry) and send it to another client that has the resources to format the event for display.
The implementation of this logger is fast with minimal stack usage making it appropriate for a realtime application. This logger writes all Log events to a circular buffer. As a result, the execution time of all Log methods bound to this type of logger are deterministic (and quite short) because there are no additional memory allocation calls after the circular buffer was allocated.
If this logger is used in a preemptive environment, then an appropriate gate must be assigned to the module. For example, if events are generated from an interrupt context, then a gate that disables interrupts must be used.
  var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
  LoggerBuf.common$.gate = ...some gate instance...
If the buffer type is circular, the log buffer of size numEntries contains the last numEntries of Log events. If the buffer type is fixed, the log buffer contains the first numEntries events.
EXAMPLES
Configuration example: The following XDC configuration statements create a logger instance, assign it as the default logger for all modules, and enable USER1 logging in all modules of the package my.pkg. See the Diags.setMaskMeta() function for details on specifying the module names.
  var Defaults = xdc.useModule('xdc.runtime.Defaults');
  var Diags = xdc.useModule('xdc.runtime.Diags');
  var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');

  LoggerBuf.enableFlush = true;
  var LoggerBufParams = new LoggerBuf.Params();
  LoggerBufParams.exitFlush = true;
  Defaults.common$.logger = LoggerBuf.create(LoggerBufParams);
  Diags.setMaskMeta("my.pkg.%", Diags.USER1, Diags.RUNTIME_ON);
 
proxy LoggerBuf.TimestampProxy

User supplied time-stamp proxy

XDCscript usage meta-domain
LoggerBuf.TimestampProxy = ITimestampClient.Module null
// some delegate module inheriting the ITimestampClient interface
    LoggerBuf.TimestampProxy.delegate$ = ITimestampClient.Module null
    // explicit access to the currently bound delegate module
 
DETAILS
This proxy allows LoggerBuf to use a timestamp server different from the server used by xdc.runtime.Timestamp. However, if not supplied by a user, this proxy defaults to whichever timestamp server is used by Timestamp.
 
enum LoggerBuf.BufType

Type of log buffer

XDCscript usage meta-domain
values of type LoggerBuf.BufType
    const LoggerBuf.BufType_CIRCULAR;
    // The log buffer wraps, overwriting old entries
    const LoggerBuf.BufType_FIXED;
    // The log buffer halts collection when full
C synopsis target-domain
typedef enum LoggerBuf_BufType {
    LoggerBuf_BufType_CIRCULAR,
    // The log buffer wraps, overwriting old entries
    LoggerBuf_BufType_FIXED
    // The log buffer halts collection when full
} LoggerBuf_BufType;
 
 
metaonly struct LoggerBuf.BasicView
XDCscript usage meta-domain
var obj = new LoggerBuf.BasicView;
 
    obj.label = String  ...
    obj.lastSerial = Int  ...
    obj.enabledFlag = Bool  ...
 
 
metaonly struct LoggerBuf.RecordView
XDCscript usage meta-domain
var obj = new LoggerBuf.RecordView;
 
    obj.serial = Int  ...
    obj.timestamp = Int  ...
    obj.modName = String  ...
    obj.text = String  ...
    obj.eventId = Int  ...
    obj.eventName = String  ...
    obj.arg0 = IArg  ...
    obj.arg1 = IArg  ...
    obj.arg2 = IArg  ...
    obj.arg3 = IArg  ...
 
 
config LoggerBuf.enableFlush  // module-wide

Flush all logs at system exit

XDCscript usage meta-domain
LoggerBuf.enableFlush = Bool false;
C synopsis target-domain
extern const Bool LoggerBuf_enableFlush;
 
 
metaonly config LoggerBuf.common$  // module-wide

Common module configuration parameters

XDCscript usage meta-domain
LoggerBuf.common$ = Types.Common$ undefined;
 
DETAILS
All modules have this configuration parameter. Its name contains the '$' character to ensure it does not conflict with configuration parameters declared by the module. This allows new configuration parameters to be added in the future without any chance of breaking existing modules.
 
LoggerBuf.flushAll( )  // module-wide

Flush logs of all instances of LoggerBuf

C synopsis target-domain
Void LoggerBuf_flushAll( );
 
DETAILS
The user is responsible for making sure that no LoggerBuf instances are created or deleted while in this API, by using an appropriate gate.
 
module-wide built-ins

C synopsis target-domain
Types_ModuleId LoggerBuf_Module_id( );
// Get this module's unique id
 
Bool LoggerBuf_Module_startupDone( );
// Test if this module has completed startup
 
IHeap_Handle LoggerBuf_Module_heap( );
// The heap from which this module allocates memory
 
Bool LoggerBuf_Module_hasMask( );
// Test whether this module has a diagnostics mask
 
Bits16 LoggerBuf_Module_getMask( );
// Returns the diagnostics mask for this module
 
Void LoggerBuf_Module_setMask( Bits16 mask );
// Set the diagnostics mask for this module
 
per-instance object types

C synopsis target-domain
typedef struct LoggerBuf_Object LoggerBuf_Object;
// Opaque internal representation of an instance object
 
typedef LoggerBuf_Object *LoggerBuf_Handle;
// Client reference to an instance object
 
typedef struct LoggerBuf_Struct LoggerBuf_Struct;
// Opaque client structure large enough to hold an instance object
 
LoggerBuf_Handle LoggerBuf_handle( LoggerBuf_Struct *structP );
// Convert this instance structure pointer into an instance handle
 
LoggerBuf_Struct *LoggerBuf_struct( LoggerBuf_Handle handle );
// Convert this instance handle into an instance structure pointer
 
per-instance config parameters

XDCscript usage meta-domain
var params = new LoggerBuf.Params;
// Instance config-params object
    params.bufHeap = IHeap.Handle null;
    // The heap that contains the Log buffer for dynamic instances
    params.bufSection = String null;
    // Section name for the buffer managed by the static instance
    params.bufType = LoggerBuf.BufType LoggerBuf.BufType_CIRCULAR;
    // Log buffer type
    params.exitFlush = Bool false;
    // Flush log at system exit
    params.numEntries = Int 64;
    // Number of entries in buffer
C synopsis target-domain
typedef struct LoggerBuf_Params {
// Instance config-params structure
    IInstance_Params *instance;
    // Common per-instance configs
    IHeap_Handle bufHeap;
    // The heap that contains the Log buffer for dynamic instances
    LoggerBuf_BufType bufType;
    // Log buffer type
    Bool exitFlush;
    // Flush log at system exit
    Int numEntries;
    // Number of entries in buffer
} LoggerBuf_Params;
 
Void LoggerBuf_Params_init( LoggerBuf_Params *params );
// Initialize this config-params structure with supplier-specified defaults before instance creation
 
config LoggerBuf.bufHeap  // per-instance

The heap that contains the Log buffer for dynamic instances

XDCscript usage meta-domain
var params = new LoggerBuf.Params;
  ...
params.bufHeap = IHeap.Handle null;
C synopsis target-domain
struct LoggerBuf_Params {
      ...
    IHeap_Handle bufHeap;
 
DETAILS
The default value null means the buffer will be allocated from the Memory.defaultHeapInstance heap.
 
config LoggerBuf.bufType  // per-instance

Log buffer type

XDCscript usage meta-domain
var params = new LoggerBuf.Params;
  ...
C synopsis target-domain
struct LoggerBuf_Params {
      ...
    LoggerBuf_BufType bufType;
 
 
config LoggerBuf.exitFlush  // per-instance

Flush log at system exit

XDCscript usage meta-domain
var params = new LoggerBuf.Params;
  ...
params.exitFlush = Bool false;
C synopsis target-domain
struct LoggerBuf_Params {
      ...
    Bool exitFlush;
 
DETAILS
Only used when module parameter enableFlush is true.
 
config LoggerBuf.numEntries  // per-instance

Number of entries in buffer

XDCscript usage meta-domain
var params = new LoggerBuf.Params;
  ...
params.numEntries = Int 64;
C synopsis target-domain
struct LoggerBuf_Params {
      ...
    Int numEntries;
 
DETAILS
Each entry is large enough to store one Log event containing up to 4 optional arguments. Events containing more than 4 arguments (such as those from Log.write5) use 2 entries.
numEntries must be a power of 2.
 
metaonly config LoggerBuf.bufSection  // per-instance

Section name for the buffer managed by the static instance

XDCscript usage meta-domain
var params = new LoggerBuf.Params;
  ...
params.bufSection = String null;
 
DETAILS
The default section is the 'dataSection' in the platform.
 
per-instance creation

XDCscript usage meta-domain
var params = new LoggerBuf.Params;
// Allocate instance config-params
params.config =   ...
// Assign individual configs
 
var inst = LoggerBuf.create( params );
// Create an instance-object
C synopsis target-domain
LoggerBuf_Handle LoggerBuf_create( const LoggerBuf_Params *params, Error_Block *eb );
// Allocate and initialize a new instance object and return its handle
 
Void LoggerBuf_construct( LoggerBuf_Struct *structP, const LoggerBuf_Params *params, Error_Block *eb );
// Initialize a new instance object inside the provided structure
ARGUMENTS
params — per-instance config params, or NULL to select default values (target-domain only)
eb — active error-handling block, or NULL to select default policy (target-domain only)
SEE
 
per-instance deletion

C synopsis target-domain
Void LoggerBuf_delete( LoggerBuf_Handle *handleP );
// Finalize and free this previously allocated instance object, setting the referenced handle to NULL
 
Void LoggerBuf_destruct( LoggerBuf_Struct *structP );
// Finalize the instance object inside the provided structure
 
LoggerBuf.disable( )  // per-instance

Disable a log

C synopsis target-domain
Bool LoggerBuf_disable( LoggerBuf_Handle handle );
 
ARGUMENTS
handle — handle of a previously-created LoggerBuf instance object
DETAILS
Events written to a disabled log are silently discarded.
RETURNS
The function returns the state of the log (TRUE if enabled, FALSE if disabled) before the call. That allow clients to restore the previous state.
 
LoggerBuf.enable( )  // per-instance

Enable a log

C synopsis target-domain
Bool LoggerBuf_enable( LoggerBuf_Handle handle );
 
ARGUMENTS
handle — handle of a previously-created LoggerBuf instance object
RETURNS
The function returns the state of the log (TRUE if enabled, FALSE if disabled) before the call. That allow clients to restore the previous state.
 
LoggerBuf.flush( )  // per-instance

Read, clear, and output the contents of the log

C synopsis target-domain
Void LoggerBuf_flush( LoggerBuf_Handle handle );
 
ARGUMENTS
handle — handle of a previously-created LoggerBuf instance object
DETAILS
This method reads, clears, and "prints" each Log event (via System.printf) in the log.
 
LoggerBuf.getNextEntry( )  // per-instance

Fills the passed Log.EventRec with the next entry in the log

C synopsis target-domain
Int LoggerBuf_getNextEntry( LoggerBuf_Handle handle, Log_EventRec *evtRec );
 
ARGUMENTS
handle — handle of a previously-created LoggerBuf instance object
evtRec — pointer to a supplied EventRec object where the next entry in the log is copied to
DETAILS
This function is used to read and clear Log events from the buffer maintained by the LoggerBuf instance. The Log event can then be transmitted and displayed on a host.
A read pointer is maintained in the LoggerBuf instance and points to the next record to read. Entries are not necessarily returned in chronological order, since buffers of type BufType_CIRCULAR can wrap.
RETURNS
This function reports the number of entries actually read. The only values that can be returned are:
  • 0 no more entries to read
  • 1 or 2 read a complete entry written by write4 or write8
  • -1 cleared an incomplete/overwritten entry, more entries to read
 
LoggerBuf.reset( )  // per-instance

Reset a log to empty state and enable it

C synopsis target-domain
Void LoggerBuf_reset( LoggerBuf_Handle handle );
 
ARGUMENTS
handle — handle of a previously-created LoggerBuf instance object
WARNING
This method is not synchronized with other instance methods and, as a result, it must never be called when there is a chance that another instance method is currently in operation or when another method on this instance may preempt this call.
 
LoggerBuf.write4( )  // per-instance

Process a log event with up to 4 arguments

C synopsis target-domain
Void LoggerBuf_write4( LoggerBuf_Handle handle, Types_Event evt, IArg a1, IArg a2, IArg a3, IArg a4 );
 
ARGUMENTS
handle — handle of a previously-created LoggerBuf instance object
evt — event to be logged
a1 — arbitrary argument passed by caller
This parameter, along with a2, a3, and a4 are parameters that are to be interpreted according to the message format string associated with evt.
DETAILS
At the time this method is called, evt encodes two values: the module ID of the module that "triggered" a Log.Event and the Log.EventId of the event. The module ID can be obtained via Types.getModuleId(evt) and the event ID can be obtained via Types.getEventId(evt).
The event ID can be used to compare against other known Log.Events.
          if (Log_getEventId(MY_EVENT) == Types_getEventId(evt)) {
              :
          }
The event ID value of 0 is used to indicate an event triggered by a call to one of the Log_print[0-6] methods. These methods take a format string rather than a Log_Event argument and, as a result, the event ID encoded in evt is 0 and the parameter a1 is the format string.
Non-zero event IDs can also be used to access the msg string associated with the Log.EventDesc that originally defined the Log event.
          Types_EventId id = Types_getEventId(evt));
          if (id != 0) {
              String msg = Text_ropeText(id);
              System_aprintf(msg, a1, a2, a3, a4);
          }
This works because an event's ID is simply an offset into a table of characters (maintained by the Text module) containing the event's msg string.
SEE
 
LoggerBuf.write8( )  // per-instance

Process a log event with up to 8 arguments

C synopsis target-domain
Void LoggerBuf_write8( LoggerBuf_Handle handle, Types_Event evt, IArg a1, IArg a2, IArg a3, IArg a4, IArg a5, IArg a6, IArg a7, IArg a8 );
 
ARGUMENTS
handle — handle of a previously-created LoggerBuf instance object
DETAILS
Same as write4 except with 8 arguments rather than 4.
SEE
 
per-instance convertors

C synopsis target-domain
ILogger_Handle LoggerBuf_Handle_upCast( LoggerBuf_Handle handle );
// unconditionally move one level up the inheritance hierarchy
 
LoggerBuf_Handle LoggerBuf_Handle_downCast( ILogger_Handle handle );
// conditionally move one level down the inheritance hierarchy; NULL upon failure
 
per-instance built-ins

C synopsis target-domain
Int LoggerBuf_Object_count( );
// The number of statically-created instance objects
 
LoggerBuf_Handle LoggerBuf_Object_get( LoggerBuf_Object *array, Int i );
// The handle of the i-th statically-created instance object (array == NULL)
 
LoggerBuf_Handle LoggerBuf_Object_first( );
// The handle of the first dynamically-created instance object, or NULL
 
LoggerBuf_Handle LoggerBuf_Object_next( LoggerBuf_Handle handle );
// The handle of the next dynamically-created instance object, or NULL
 
IHeap_Handle LoggerBuf_Object_heap( );
// The heap used to allocate dynamically-created instance objects
 
Types_Label *LoggerBuf_Handle_label( LoggerBuf_Handle handle, Types_Label *buf );
// The label associated with this instance object
 
String LoggerBuf_Handle_name( LoggerBuf_Handle handle );
// The name of this instance object
generated on Tue, 01 Sep 2009 00:36:16 GMT