/* * 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 #include #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 */