windows-nt/Source/XPSP1/NT/net/snmp/subagent/hostmib/hmcache.h
2020-09-26 16:20:57 +08:00

389 lines
14 KiB
C

/*
* File HMCACHE.H
*
* Facility:
*
* Windows NT SNMP Extension Agent
*
* Abstract:
*
* This module is contains definitions pertaining to the HostMIB
* cacheing mechanism.
*
* Author:
*
* D. D. Burns @ WebEnable, Inc.
*
*
* Revision History:
*
* V1.0 - 04/17/97 D. D. Burns Original Creation
*/
#ifndef hmcache_h
#define hmcache_h
/*
|==============================================================================
| Debug Cache Dump Support
|
| Define "CACHE_DUMP" to get function "PrintCache" defined to enable
| debug-dumping of any cache for which a debug_print function is defined
| (in a CACHEHEAD_INSTANCE() macro that defines the list-head of the cache).
|
| Define "DUMP_FILE" to specify where the dump file is generated. All
| opens on this file are for "append", so you must explicitly delete the
| file if you want to start fresh. All entries are time-stamped, so any
| confusion is your own, though.
|
| NOTE 1: After defining "CACHE_DUMP", grep the sources to see what caches
| "PrintCache()" may be being invoked on and where. Typically
| all caches are dumped immediately after they are built. The
| cache for hrSWRun(Perf) table is re-built if it is older than
| "CACHE_MAX_AGE" (defined in "HRSWRUNE.C") when a request for
| something in the tables served by the cache comes in. So it
| may also be dumped after each (re-)build.
|
| NOTE 2: Define "PROC_CACHE" to get a periodic dump to "PROC_FILE" of
| the hrProcessorLoad-specific cache. This dump occurs on a
| 1-minute timer and will rapidly use up disk space if left
| running for any long period. This cache and dump is special
| to the "hrProcessorLoad" variable in hrProcessor sub-table.
| (Opens on this file are also for "append").
*/
//#define CACHE_DUMP 1
#define DUMP_FILE \
"c:\\nt\\private\\net\\snmp\\subagent\\hostmib\\HostMib_Cache.dmp"
//#define PROC_CACHE 1
#define PROC_FILE \
"c:\\nt\\private\\net\\snmp\\subagent\\hostmib\\Processor_Cache.dmp"
#if defined(CACHE_DUMP) || defined(PROC_CACHE)
#include <stdio.h>
#include <time.h>
#endif
/*
|==============================================================================
| hrStorage Attribute Defines
|
| Each attribute defined for hrStorage table is associated with one of the
| #defines below. These symbols are used as C indices into the list of
| attributes within a cached-row.
|
| These symbols are globally accessible so that logic that builds hrFSTable
| can "peek" at values stored in the hrStorageTable cache.
*/
#define HRST_INDEX 0 // hrStorageIndex
#define HRST_TYPE 1 // hrStorageType
#define HRST_DESCR 2 // hrStorageDescr
#define HRST_ALLOC 3 // hrStorageAllocationUnits
#define HRST_SIZE 4 // hrStorageSize
#define HRST_USED 5 // hrStorageUsed
#define HRST_FAILS 6 // hrStorageAllocationFailures
//-->Add more here, change count below!
#define HRST_ATTRIB_COUNT 7
/*
|==============================================================================
| hrFSTable Attribute Defines
|
| Each attribute defined for hrFSTable is associated with one of the
| #defines below. These symbols are used as C indices into the array of
| attributes within a cached-row.
|
| These symbols are globally accessible so that logic that builds
| hrPartition can "peek" at values stored in the hrFSEntry Table cache.
*/
#define HRFS_INDEX 0 // hrFSIndex
#define HRFS_MOUNTPT 1 // hrFSMountPoint
#define HRFS_RMOUNTPT 2 // hrFSRemoteMountPoint
#define HRFS_TYPE 3 // hrFSType
#define HRFS_ACCESS 4 // hrFSAccess
#define HRFS_BOOTABLE 5 // hrFSBootable
#define HRFS_STORINDX 6 // hrFSStorageIndex
#define HRFS_LASTFULL 7 // hrFSLastFullBackupDate
#define HRFS_LASTPART 8 // hrFSLastPartialBackupDate
//-->Add more here, change count below!
#define HRFS_ATTRIB_COUNT 9
/*
|==============================================================================
| hrSWRun(Perf) Table Attribute Defines
|
| Each attribute defined for hrSWRun Table and hrSWRunPerf Table is
| associated with one of the #defines below. These symbols are used as
| C indices into the array of attributes within a cached-row.
|
| These symbols are globally accessible so that logic for hrSWRunPerf table
| (in "HRSWPREN.C") can reference these as well as logic for hrSWRun table
| (in "HRSWRUNE.C") since both tables share the same cache.
|
| Note that "HrSWRunID" is not cached.
*/
#define HRSR_INDEX 0 // HrSWRunIndex
#define HRSR_NAME 1 // HrSWRunName
#define HRSR_PATH 2 // HrSWRunPath
#define HRSR_PARAM 3 // HRSWRunParameters
#define HRSR_TYPE 4 // HrSWRunType
#define HRSR_STATUS 5 // HrSWRunStatus
#define HRSP_CPU 6 // HrSWRunPerfCPU - Performance
#define HRSP_MEM 7 // HrSWRunPerfMem - Performance
//-->Add more here, change count below!
#define HRSR_ATTRIB_COUNT 8
/*
|==============================================================================
| These structures are used in the implementation of an in-memory cache
| for the Host Resources MIB subagent. For a broad overview of the cache
| scheme, see the documentation at the front of "HMCACHE.C".
|==============================================================================
*/
/*
|==============================================================================
| ATTRIB_TYPE
|
| This enumerated type lists the data-type of a value of an attribute
| stored in an instance of a ATTRIB structure (one of typically many
| in a CACHEROW structure for a given table row).
|
| "CA_STRING"
| The value is a null-terminated string sitting in 'malloc'ed storage
| within an ATTRIB structure.
|
| "CA_NUMBER"
| The value is a binary numeric value stored directly in the ATTRIB
| structure. No additional malloc storage is associated with this
| type.
|
| "CA_COMPUTED"
| The value is not stored in the ATTRIB structure at all, but is
| dynamic and is computed and returned by the support subagent
| "get" function.
|
| "CA_CACHE"
| The value is a pointer to a CACHEHEAD structure that describes
| another cache. The CACHEHEAD structure is in 'malloc'ed storage.
| This is used for "multiply-indexed" tables.
|
| Note that the instance of this enumerated type (in ATTRIB below) is mainly
| of use in debugging and memory management (when we get to the point where
| cached-rows may be freed). Generally the "Get" function that is going to
| reach into the cache is already going to be coded according to what is
| there, and may not even look to see what "type" the value is.
|==============================================================================
*/
typedef
enum {
CA_UNKNOWN, /* Not yet set */
CA_STRING, /* ('malloc'ed storage) */
CA_NUMBER, /* (no 'malloc'ed storage) */
CA_COMPUTED, /* (no 'malloc'ed storage) */
CA_CACHE /* ('malloc'ed storage) */
} ATTRIB_TYPE;
/*
|==============================================================================
| ATTRIB
|
| An array of these structures is logically allocated inside each
| instance of a CACHEROW structure.
|
| An instance of this structure describes the value of one attribute
| in the cache (in general; in the "CA_COMPUTED" case there is no value
| present, the GET function "knows" what to do).
|==============================================================================
*/
typedef
struct {
ATTRIB_TYPE attrib_type; /* STRING, NUMBER, (COMPUTED) */
union {
LPSTR string_value; /* CA_STRING (malloc) */
ULONG unumber_value; /* CA_NUMBER (unsigned) */
LONG number_value; /* CA_NUMBER (signed) */
void *cache; /* CA_CACHE (malloc) */
} u;
} ATTRIB;
/*
|==============================================================================
| CACHEROW
|
| An instance of this structure occurs for each row in a table. Instances
| are strung on a list maintained by a CACHEHEAD structure (below), ordered
| by the value of "index".
|
| The "attrib_list[]" array storage is malloc'ed to the appropriate size
| at the time an instance of this structure is created. The indices into
| this array are #DEFINED symbols, all according to the table definition
| of the attributes in the table. Typically the #defines are placed in
| the source module that implements the table.
|
| The internal arrangement of this structure (and underlying structures)
| is meant to be such that function "DestroyTableRow()" can release all
| storage for an instance of this structure without "knowing" the #DEFINE
| index symbols above (or anything else).
|==============================================================================
*/
typedef
struct rc_tag{
ULONG index; /* SNMP index of table */
struct rc_tag *next; /* Next in the cache list */
/*
| Contents of this table row:
*/
ULONG attrib_count; /* # of elements in "attrib_list"[] */
ATTRIB *attrib_list; /* --> array of attributes */
} CACHEROW;
/*
|==============================================================================
| CACHEHEAD
|
| An instance of this structure (created by the macro CACHEHEAD_INSTANCE)
| occurs for each SNMP "table" cached.
|
| All CACHEROW elements of the list are ordered by their index values
| as they are inserted by general function "AddTableRow()".
|
| See documentation in "HMCACHE.C".
|
|NOTE: If you modify this structure or the macro that initializes static
| instances of it, be sure to add/change code in "HRPARTIT.C" where
| instances in dynamic (malloc) memory are created.
|==============================================================================
*/
typedef
struct {
ULONG list_count; /* (Mainly for ease of debugging) */
CACHEROW *list; /* The row list itself */
void (*print_row)(); /* Debug Print-A-Row function */
} CACHEHEAD;
#if defined(CACHE_DUMP)
#define CACHEHEAD_INSTANCE(name,debug_print) \
CACHEHEAD name={ 0, NULL, debug_print };
#else
#define CACHEHEAD_INSTANCE(name,debug_print) \
CACHEHEAD name={ 0, NULL, NULL };
#endif
/*
|==============================================================================
| HMCACHE.C - Function Prototypes
*/
/* CreateTableRow - Create a CACHEROW structure for attributes in a table */
CACHEROW *
CreateTableRow(
ULONG attribute_count
);
/* DestroyTable - Destroy all rows in CACHEHEAD structure (Release Storage) */
void
DestroyTable(
CACHEHEAD *cache /* Cache whose rows are to be Released */
);
/* DestroyTableRow - Destroy a CACHEROW structure (Release Storage) */
void
DestroyTableRow(
CACHEROW *row /* Row to be Released */
);
/* AddTableRow - Adds a specific "row" into a cached "table" */
BOOL
AddTableRow(
ULONG index, /* Index for row desired */
CACHEROW *row, /* Row to be added to .. */
CACHEHEAD *cache /* this cache */
);
/* FindTableRow - Finds a specific "row" in a cached "table" */
CACHEROW *
FindTableRow(
ULONG index, /* Index for row desired */
CACHEHEAD *cache /* Table cache to search */
);
/* FindNextTableRow - Finds Next row after a specific "row" in a cache */
CACHEROW *
FindNextTableRow(
ULONG index, /* Index for row desired */
CACHEHEAD *cache /* Table cache to search */
);
/* GetNextTableRow - Gets Next row after a specific "row" or NULL if none */
#define GetNextTableRow(row) row->next
/* ====== DEBUG DUMP SUPPORT ====== */
#if defined(CACHE_DUMP)
/* PrintCache - Dumps for debugging the contents of a cache */
void
PrintCache(
CACHEHEAD *cache /* Table cache to dump */
);
/* Debug Print Output channel used by PrintCache & "Print-A-Row" functions*/
#define OFILE Ofile
extern FILE *Ofile;
#endif
/*
|==============================================================================
| Function Prototypes for cache-related function found in other modules:
*/
/* Gen_Hrstorage_Cache - Generate a initial cache for HrStorage Table */
BOOL Gen_Hrstorage_Cache( void ); /* "HRSTOENT.C" */
extern CACHEHEAD hrStorage_cache; /* This cache is globally accessible */
/* Gen_HrFSTable_Cache - Generate a initial cache for HrFSTable */
BOOL Gen_HrFSTable_Cache( void ); /* "HRFSENTR.C" */
extern CACHEHEAD hrFSTable_cache; /* This cache is globally accessible */
/* Gen_HrDevice_Cache - Generate a initial cache for HrDevice Table */
BOOL Gen_HrDevice_Cache( void ); /* "HRDEVENT.C" */
extern CACHEHEAD hrDevice_cache; /* This cache is globally accessible */
extern ULONG InitLoadDev_index; /* From hrDevice for hrSystem */
/* Gen_HrSWInstalled_Cache - Generate a cache for HrSWInstalled Table */
BOOL Gen_HrSWInstalled_Cache( void ); /* "HESWINEN.C" */
/* Gen_HrSWRun_Cache - Generate a initial cache for HrSWRun(Perf) Table */
BOOL Gen_HrSWRun_Cache( void ); /* "HRSWRUNE.C" */
extern CACHEHEAD hrSWRunTable_cache; /* Globally accessible for ref from */
/* "HRSWPREN.C" */
extern ULONG SWOSIndex; /* From "HRSWRUNE.C" for "HRSWRUN.C" */
/* hrSWRunCache_Refresh - hrSWRun(Perf) Cache Refresh-Check Routine */
BOOL hrSWRunCache_Refresh( void );
/* hrStorageCache_hrFSTableCache_Refresh Cache Refresh-Check Routine */
BOOL hrStorageCache_hrFSTableCache_Refresh( void );
#endif /* hmcache_h */