WindowsXP/sdktools/pdh/tests/ctrtest/ctrtest_information.htm
2025-04-27 07:49:33 -04:00

648 lines
29 KiB
HTML

<html>
<head>
<title>CTRTEST Information</title>
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
</head>
<body>
<h1>CTRTEST Information</h1>
<p>CTRTEST is a test program designed to allow the Extensible Performance Counter
developer to test their performance DLL in an isolated scenario. Normally, the developer
must run the DLL in some performance monitoring client (e.g. Performance Monitor) which
calls the DLL in the context of lots of other functions making debugging and
troubleshooting difficult. </p>
<p>CTRTEST allows the developer of performance DLL's to test, debug and stress their DLL's
without the need or influence of any other program or function. CTRTEST also provides a
way to stress test the DLL in a multi-threaded environment. Although function
calls on a particular performance library are synchronized within the process,
it is important that the library support features such as Open/Close
ref-counting in order to operate correctly in a multiple threaded
environment.&nbsp; This is
especially important in that this emulates the environment that the DLL will operate in
when performance counters are monitored by a remote client.&nbsp; This is also a very
critical test since if the DLL fails during remote performance monitoring it can cause the
entire system to fail (i.e. &quot;Blue Screen&quot;).</p>
<p>CTRTEST also allows the developer to run their DLL's in combination with other specific
Counter DLL's in order to test for possible interaction problems.</p>
<h2>CTRTEST and Monitoring Clients</h2>
<p>Testing with ctrtest.exe is a method of “black box” testing which
attempts to establish a benchmark for determining whether a performance library
can be considered to be “trusted”.<span style="mso-spacerun: yes">&nbsp; </span>A
trusted performance library will not be subjected to the level of run-time
validation in Wbemperf.dll (via WMI) and Perflib (via RegQueryValuEx(
HKey_PerformanceData ) ) that un-trusted performance libraries undergo.<span style="mso-spacerun: yes">&nbsp;
</span>The reduced amount of error checking means higher performance from
applications retrieving data from trusted performance libraries.</p>
<h2>Running CTRTEST</h2>
<p>The command line syntax of CTRTEST is</p>
<blockquote>
<p><small><strong><font face="Lucida Console">CTRTEST &lt;path to ini file&gt; </font></strong></small></p>
</blockquote>
<p>where:</p>
<p><small><font face="Lucida Console"><strong>&lt;path to ini file&gt;</strong></font></small>
is the location of the CTRTEST.INI file that contains the execution parameters.&nbsp; If
this is not provided, CTRTEST will default to the current working directory for the
location of the CTRTEST.INI file.</p>
<h2>CTRTEST.INI</h2>
<p>The format of the INI file is as follows:</p>
<p>[main]<br>
NumThreads=10<br>
CycleCount=100<br>
LoopCount=1<br>
Random=1<br>
StopOnError=11<br>
NumObjects=2<br>
Object0=perfproc<br>
Object1=perfos<br>
Counter1=238</p>
<p><strong><small><font face="Lucida Console">NumThreads</font></small></strong> is the
number of threads that will run during the test at the same time. Each thread will run the
same &quot;Open, Collect X n, Close&quot; cycle that is specified by CycleCount.</p>
<p><strong><small><font face="Lucida Console">CycleCount</font></small></strong> is the
number of times CTRTEST will call Open, Collect and Close in that sequence. This entry
must be a decimal number.</p>
<p><strong><small><font face="Lucida Console">LoopCount</font></small></strong> is the
number of times CTRTEST will call the collect function between the Open and Close
functions during each cylce. This entry must be a decimal number.</p>
<p><strong><small><font face="Lucida Console">Random</font></small></strong> controls
randomization on each cycle.&nbsp; If this value is non-zero, each time a cycle is run,
CTRTEST will randomly choose a performance library to query.</p>
<p><strong><small><font face="Lucida Console">StopOnError</font></small></strong> controls
the behavior of ctrtest when an error is encountered.&nbsp; A value of 0
indicates that the application should continue running after an error is
encountered, a 1 will cause the threads to gracefully terminate and the
application will stop.&nbsp; A value of 2 will cause a debug breakpoint to be
thrown, and processing will terminate immediately terminate at the offending
error check.</p>
<p><strong><small><font face="Lucida Console">NumObjects</font></small></strong> indicates
how many performance DLL's CTRTEST should work with.</p>
<p><strong><small><font face="Lucida Console">Objectn</font></small></strong> specifies
the name of the service the performance counters are registered under. CTRTEST will only
test counter DLL's that have been registered by LODCTR. This is also the name that your
DLL will be listed with in the EXCTRLST list box. If your DLL supports more than one
service entry, then you'll need to repeat the test for each service.</p>
<p><strong><small><font face="Lucida Console">Countern</font></small></strong> specifies
the query string that will be passed into the corresponding performance DLL's Collect
function.&nbsp; If no value is specified, CTRTEST will default to use &quot;Global&quot;.</p>
<p>For example, in the sample INI file above, when CTRTEST executes, it will spawn 10
threads that will each perform 100 Open/Collect/Close Cycles.&nbsp; During each cycle,
Collect will be called once.&nbsp; On each cycle on each thread, CTRTEST will randomly
choose between the &quot;perfproc&quot; and &quot;perfos&quot; performance DLL's.
&nbsp; When the Collect function is called for &quot;perfproc&quot;, CTRTEST will specify
a query string of &quot;Global&quot;.&nbsp; When the Collect function is called for
&quot;perfos&quot;, CTRTEST will specify a query string of &quot;238&quot; (which in this
case is the &quot;Processor&quot; object).</p>
<h2>Testing with CTRTEST</h2>
<p>While CTRTEST will spew statistics to the console (these can be redirected to a file
for later processing). It's also important to monitor your test run using Performance
Monitor. You should monitor the following counters from the Process object:</p>
<blockquote>
<p>-- Private Bytes<br>
-- Handle Count<br>
-- Thread Count</p>
</blockquote>
<p>While the test is running, these counters should not increase during the test. They
should reach some operating level and stay there or below, but not slope up. If the plot
of any of these counters goes up, then you probably have a resource leak somewhere in the
DLL. You should run this test both from within a debugger as well as on it's own. Running
in a debugger will allow you to catch any exceptions that may or may not be handled. Also
running the test inside other tools such as NuMega's BoundsChecker can help spot memory
and other resource leaks.</p>
<p>CTRTEST will also check that returned buffers do not have memory overwrite errors or
that the returned buffer sizes make sense (e.g. less than or equal to the size of the
specified buffer).&nbsp; If it encounters these sorts of conditions, it will stop
processing.</p>
<p>Before you attempt to run your counter DLL in a &quot;retail&quot; or
&quot;production&quot; environment, it should run cleanly with the following settings
(This is the bare minimum test): </p>
<p>[main]<br>
NumThreads=10<br>
CycleCount=100<br>
LoopCount=100<br>
NumObjects=1<br>
Object0=&lt;your service name here&gt;</p>
<p>Ideally you'll run more thorough tests such as</p>
<p>[main]<br>
NumThreads=10<br>
CycleCount=1000<br>
LoopCount=100<br>
NumObjects=1<br>
Object0=&lt;your service name here&gt;</p>
<p>You should also try settings such as the following to check for potential interaction
problems:</p>
<p>[main]<br>
NumThreads=10<br>
CycleCount=1000<br>
LoopCount=100<br>
Randomt=1<br>
NumObjects=5<br>
Object0=&lt;your service name here&gt;<br>
Object1=perfproc<br>
Object2=perfos<br>
Object3=perfnet<br>
Object4=perfdisk</p>
<p>You can use EXCTRLST to get a list of all Performance DLL's on a system, if you are
suspecting interaction problems with another DLL other than the base ones mentioned above.</p>
<h2>Test Outline</h2>
<table border="1" cellspacing="0" cellpadding="0" width="708" style="border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0in 5.4pt 0in 5.4pt; border-style: none; border-width: medium">
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal" align="center" style="text-align:center"><b>Test<o:p>
</o:p>
</b></p>
</td>
<td width="212" valign="top" style="width:158.9pt;border:solid windowtext .5pt;
border-left:none;mso-border-left-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal" align="center" style="text-align:center"><b>Goal<o:p>
</o:p>
</b></p>
</td>
<td width="194" valign="top" style="width:145.85pt;border:solid windowtext .5pt;
border-left:none;mso-border-left-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal" align="center" style="text-align:center"><b>Error
Checks<o:p>
</o:p>
</b></p>
</td>
</tr>
<tr style="height:1.45pt;mso-height-rule:exactly">
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt;
height:1.45pt;mso-height-rule:exactly">
<p class="MsoNormal">&nbsp;<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt;height:1.45pt;mso-height-rule:exactly">
<p class="MsoNormal">&nbsp;<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt;height:1.45pt;mso-height-rule:exactly">
<p class="MsoNormal">&nbsp;<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Open entry point call on a performance library<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Opens performance library without failing.<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Assertion<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Collect entry point call on a performance library<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Collects performance blob consisting of 0 or more
bytes.<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Assertion; Blob offset not equal to advance in blob
pointer; Heap Corruption<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Close entry point call on a performance library<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Closes performance library without failing.<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Assertion<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Multiple overlapping calls to Open, Collect and Close
entry points on a performance library<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Open / close reference counting succeeds and
collection can occur.<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Assertion<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Processing multiple performance libraries on shared<span style="mso-spacerun: yes">&nbsp;
</span>thread <o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Ensure that performance libraries may co-exist in
shared heap space.<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Assertion; Heap Corruption<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Blob boundary validation<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Ensure that the blob returned from the Collection
function did not over-write guard byte data outside of the allocated
buffer<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Assertion; Guard byte overwrite; Blob size comparison
to allocated buffer size<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Blob offset validation<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Walk the blob and ensure that all offsets resolve to
a value within the blob boundaries<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Assertion; Boundary validation<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Buffer size sanity check<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Ensure that the memory allocation required by the
performance blob does not exceed a maximum threshold (MAX_BUFFER_SIZE). <o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Assertion; Out-of-memory; Max. buffer size<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">Buffer
size validation</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">Ensure that the value of the buffer size returned
from the collect function is less than the size of the allocated buffer </td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">&nbsp;</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Entry point latency<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Total wait time for obtaining the perflib-specific
mutex is less than a maximum threshold<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">WaitForSingleObject timeout<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Enumerate Class Definitions <o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Number of Class Definitions specified in Collect
parameter should be the same as the number within the performance blob<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Mismatch<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Blob size and pointer advancement<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">The blob size returned from the collect function
should be equal to the blob pointer displacement<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Equivalence<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Blob offset validation<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Ensure that blob offsets are non-zero<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Equivalence<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Instance Validation<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Validate number of instances stored for each class is
equal to the number of instances specified by NumInstances in the
PERF_OBJECT_TYPE block.<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Mismatch<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Singleton Validation<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Validate that singleton object has the same number of
counters as specified by NumCounters in the PERF_OBJECT_TYPE block.<span style="color:red"><o:p>
</o:p>
</span></p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Mismatch<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Counter Validation<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Validate that the number of counter definitions
stored for each instance is equal to the number of counters specified by
NumCounters in the PERF_OBJECT_TYPE block.<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Mismatch<o:p>
</o:p>
</p>
</td>
</tr>
<tr>
<td width="179" valign="top" style="width:134.5pt;border:solid windowtext .5pt;
border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">8 byte alignment<o:p>
</o:p>
</p>
</td>
<td width="212" valign="top" style="width:158.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Check that the returned buffer is 8-byte aligned.<o:p>
</o:p>
</p>
</td>
<td width="194" valign="top" style="width:145.85pt;border-top:none;border-left:
none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt">
<p class="MsoNormal">Masking</p>
</td>
</tr>
</table>
</body>
</html>