1 <?xml version="1.0" encoding="utf-8"?>
   2 <!--
   3  Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
   4  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 
   6  This code is free software; you can redistribute it and/or modify it
   7  under the terms of the GNU General Public License version 2 only, as
   8  published by the Free Software Foundation.
   9 
  10  This code is distributed in the hope that it will be useful, but WITHOUT
  11  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  version 2 for more details (a copy is included in the LICENSE file that
  14  accompanied this code).
  15 
  16  You should have received a copy of the GNU General Public License version
  17  2 along with this work; if not, write to the Free Software Foundation,
  18  Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19 
  20  Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  or visit www.oracle.com if you need additional information or have any
  22  questions.
  23 -->
  24 
  25 <!DOCTYPE types SYSTEM "trace.dtd">
  26 
  27 <!--
  28 
  29 Content types (complex) should create constant pool data
  30 in the recording.
  31 Currently at least, there is _NO_ verification that whatever
  32 writer you have is actually writing correctly. So BE CAREFUL!
  33 
  34 Declared with the 'content_type' tag.
  35 
  36 <type> is the ID type, i.e the integer type that resolves this. Most often
  37 U4 or U8, but for example really small number constants, like GCTYPE uses U1.
  38 
  39 <content-type> is where it gets interesting. 'builtin_type' means we're
  40 defining how we resolve one of the trace built-in types (Class, Thread etc),
  41 jvm_type means defining a new one for our own use.
  42 
  43 Example: (GcMode)
  44 
  45 <content_type id="GCMode" hr_name="GC mode" type="U1" jvm_type="GCMODE">
  46   <value type="UTF8" field="desc" description="Description"/>
  47 </content_type>
  48 
  49 This creates a content type CONTENT_TYPE_GCMODE
  50 The field type referencing it is u1 (U1), and the constant pool struct has one field, the name.
  51 
  52 Before we can use it we need also define a primary field data type:
  53 
  54 <primary_type symbol="GCMODE" datatype="U1" contenttype="NONE"
  55               type="u8" sizeop="sizeof(u1)"/>
  56 
  57 Now we can use the content + data type in declaring event fields.
  58  -->
  59 
  60  <types>
  61   <content_types>
  62     <content_type id="Thread" hr_name="Thread"
  63                   type="U4" builtin_type="OSTHREAD">
  64       <value type="UTF8" field="name" label="Thread name"/>
  65     </content_type>
  66 
  67     <content_type id="VMThread" hr_name="VM Thread"
  68                   type="U8" jvm_type="VMTHREAD">
  69       <value type="OSTHREAD" field="thread" label="VM Thread"/>
  70     </content_type>
  71 
  72     <content_type id="JavaThread" hr_name="Java thread"
  73                   type="U8" builtin_type="JAVALANGTHREAD">
  74       <value type="OSTHREAD" field="thread" label="OS Thread ID"/>
  75       <value type="BYTES64" field="allocInsideTla"
  76              label="Allocated bytes inside TLAs"/>
  77       <value type="BYTES64" field="allocOutsideTla"
  78              label="Allocated bytes outside TLAs"/>
  79       <value type="THREADGROUP" field="group" label="Java Thread Group"/>
  80     </content_type>
  81 
  82     <content_type id="ThreadGroup" hr_name="Thread group"
  83                   type="U4" jvm_type="THREADGROUP">
  84       <value type="THREADGROUP" field="parent" label="Parent"/>
  85       <value type="UTF8" field="name" label="Name"/>
  86     </content_type>
  87 
  88     <content_type id="Class" hr_name="Java class"
  89                   type="U8" builtin_type="CLASS">
  90       <value type="CLASS" field="loaderClass" label="ClassLoader"/>
  91       <value type="SYMBOL" field="name" label="Name"/>
  92       <value type="SHORT" field="modifiers" label="Access modifiers"/>
  93     </content_type>
  94 
  95     <content_type id="Method" hr_name="Java method"
  96                   type="U8" jvm_type="METHOD">
  97       <value type="CLASS" field="class" label="Class"/>
  98       <value type="SYMBOL" field="name" label="Name"/>
  99       <value type="SYMBOL" field="signature" label="Signature"/>
 100       <value type="SHORT" field="modifiers" label="Access modifiers"/>
 101     </content_type>
 102 
 103     <content_type id="UTFConstant" hr_name="UTF constant"
 104                   type="U8" jvm_type="SYMBOL">
 105       <value type="UTF8" field="utf8" label="UTF8 data"/>
 106     </content_type>
 107 
 108     <content_type id="ThreadState" hr_name="Java Thread State"
 109                   type="U2" jvm_type="THREADSTATE">
 110       <value type="UTF8" field="name" label="Name"/>
 111     </content_type>
 112 
 113     <content_type id="GCName" hr_name="GC Name"
 114                   type="U1" jvm_type="GCNAME">
 115       <value type="UTF8" field="name" label="name" />
 116     </content_type>
 117 
 118     <content_type id="GCCause" hr_name="GC Cause"
 119                   type="U2" jvm_type="GCCAUSE">
 120       <value type="UTF8" field="cause" label="cause" />
 121     </content_type>
 122 
 123     <content_type id="GCWhen" hr_name="GC When"
 124                   type="U1" jvm_type="GCWHEN">
 125       <value type="UTF8" field="when" label="when" />
 126     </content_type>
 127 
 128     <content_type id="G1YCType" hr_name="G1 YC Type"
 129                   type="U1" jvm_type="G1YCTYPE">
 130       <value type="UTF8" field="type" label="type" />
 131     </content_type>
 132 
 133     <content_type id="GCThresholdUpdater" hr_name="GC Treshold Updater"
 134                   type="U1" jvm_type="GCTHRESHOLDUPDATER">
 135       <value type="UTF8" field="updater" label="updater" />
 136     </content_type>
 137 
 138     <content_type id="ReferenceType" hr_name="Reference Type"
 139                   type="U1" jvm_type="REFERENCETYPE">
 140       <value type="UTF8" field="type" label="type" />
 141     </content_type>
 142 
 143     <content_type id="NARROW_OOP_MODE" hr_name="Narrow Oop Mode"
 144                   type="U1" jvm_type="NARROWOOPMODE">
 145       <value type="UTF8" field="mode" label="mode" />
 146     </content_type>
 147 
 148     <content_type id="VMOperationType" hr_name="VM Operation Type"
 149                   type="U2" jvm_type="VMOPERATIONTYPE">
 150       <value type="UTF8" field="type" label="type" />
 151     </content_type>
 152 
 153     <content_type id="CompilerPhaseType" hr_name="Compiler Phase Type"
 154                   type="U1" jvm_type="COMPILERPHASETYPE">
 155       <value type="UTF8" field="phase" label="phase" />
 156     </content_type>
 157 
 158     <content_type id="FlagValueOrigin" hr_name="Flag Value Origin"
 159                   type="U1" jvm_type="FLAGVALUEORIGIN">
 160       <value type="UTF8" field="origin" label="origin" />
 161     </content_type>
 162 
 163   </content_types>
 164 
 165 
 166   <primary_types>
 167     <!--
 168       - primary_type takes these attributes:
 169       -   symbol      INTEGER, LONG etc
 170       -   datatype    The trace datatype, see enum DataType
 171       -   contenttype Either resolved content type or the semantic meaning
 172       -   type        The actual type as used in structures etc
 173       -   sizeop      A function/macro that can be applied on a single
 174       -               struct value of type "type" and yield the factual byte
 175       -               size we need to write.  The % is replaced by the value
 176       -->
 177 
 178     <!-- SIGNED 64bit -->
 179     <primary_type symbol="LONG" datatype="LONG" contenttype="NONE"
 180                   type="s8" sizeop="sizeof(s8)"/>
 181 
 182     <!-- UNSIGNED 64bit -->
 183     <primary_type symbol="ULONG" datatype="U8" contenttype="NONE"
 184                   type="u8" sizeop="sizeof(u8)"/>
 185 
 186     <!-- SIGNED 32bit -->
 187     <primary_type symbol="INTEGER" datatype="INT" contenttype="NONE"
 188                   type="s4" sizeop="sizeof(s4)"/>
 189 
 190     <!-- UNSIGNED 32bit -->
 191     <primary_type symbol="UINT" datatype="U4" contenttype="NONE"
 192                   type="unsigned" sizeop="sizeof(unsigned)"/>
 193 
 194     <!-- UNSIGNED 16bit -->
 195     <primary_type symbol="USHORT" datatype="U2" contenttype="NONE"
 196                   type="u2" sizeop="sizeof(u2)"/>
 197 
 198     <!--  SIGNED 16bit -->
 199     <primary_type symbol="SHORT" datatype="SHORT" contenttype="NONE"
 200                   type="s2" sizeop="sizeof(s2)"/>
 201 
 202     <!--  SIGNED 8bit -->
 203     <primary_type symbol="BYTE" datatype="BYTE" contenttype="NONE"
 204                   type="s1" sizeop="sizeof(s1)"/>
 205 
 206     <!--  UNSIGNED 8bit -->
 207     <primary_type symbol="UBYTE" datatype="U1" contenttype="NONE"
 208                   type="u1" sizeop="sizeof(u1)"/>
 209 
 210     <!--  float 32bit -->
 211     <primary_type symbol="FLOAT" datatype="FLOAT" contenttype="NONE"
 212                   type="float" sizeop="sizeof(float)"/>
 213 
 214     <!--  float 64bit -->
 215     <primary_type symbol="DOUBLE" datatype="DOUBLE" contenttype="NONE"
 216                   type="double" sizeop="sizeof(double)"/>
 217 
 218     <!-- boolean type (1-byte) -->
 219     <primary_type symbol="BOOLEAN" datatype="BOOLEAN" contenttype="NONE"
 220                   type="bool" sizeop="1"/>
 221 
 222     <!-- 32-bit unsigned integer, SEMANTIC value BYTES -->
 223     <primary_type symbol="BYTES" datatype="U4" contenttype="BYTES"
 224                   type="u4" sizeop="sizeof(u4)"/>
 225 
 226     <primary_type symbol="IOBYTES" datatype="U4" contenttype="BYTES"
 227                   type="u4" sizeop="sizeof(u4)"/>
 228 
 229     <!-- 64-bit unsigned integer, SEMANTIC value BYTES -->
 230     <primary_type symbol="BYTES64" datatype="U8" contenttype="BYTES"
 231                   type="u8" sizeop="sizeof(u8)"/>
 232 
 233     <!-- 64-bit unsigned integer, SEMANTIC value ABSOLUTE MILLISECONDS -->
 234     <primary_type symbol="EPOCHMILLIS" datatype="LONG" contenttype="EPOCHMILLIS"
 235                   type="s8" sizeop="sizeof(s8)"/>
 236 
 237     <!-- 64-bit unsigned integer, SEMANTIC value RELATIVE MILLISECONDS -->
 238     <primary_type symbol="MILLIS" datatype="LONG" contenttype="MILLIS"
 239                   type="s8" sizeop="sizeof(s8)"/>
 240 
 241     <!-- 64-bit unsigned integer, SEMANTIC value RELATIVE NANOSECONDS -->
 242     <primary_type symbol="NANOS" datatype="LONG" contenttype="NANOS"
 243                   type="s8" sizeop="sizeof(s8)"/>
 244 
 245     <!-- 64-bit signed integer, SEMANTIC value TICKS -->
 246     <primary_type symbol="TICKS" datatype="LONG" contenttype="TICKS"
 247                   type="Ticks" sizeop="sizeof(s8)"/>
 248 
 249     <!-- 64-bit signed integer, SEMANTIC value TICKS duration -->
 250     <primary_type symbol="TICKSPAN" datatype="LONG" contenttype="TICKS"
 251                   type="Tickspan" sizeop="sizeof(s8)"/>
 252 
 253     <!-- 64-bit unsigned integer, SEMANTIC value ADDRESS (mem loc) -->
 254     <primary_type symbol="ADDRESS" datatype="U8" contenttype="ADDRESS"
 255                   type="u8" sizeop="sizeof(u8)"/>
 256 
 257     <!-- 32-bit float, SEMANTIC value PERCENTAGE (0.0-1.0) -->
 258     <primary_type symbol="PERCENT" datatype="FLOAT" contenttype="PERCENTAGE"
 259                   type="float" sizeop="sizeof(float)"/>
 260 
 261     <!-- UTF-encoded string, max length 64k -->
 262     <primary_type symbol="UTF8" datatype="UTF8" contenttype="NONE"
 263                   type="const char *" sizeop="sizeof_utf(%)"/>
 264 
 265     <!-- UTF-16 encoded (Unicode) string, max length maxjuint -->
 266     <primary_type symbol="STRING" datatype="STRING" contenttype="NONE"
 267                   type="TraceUnicodeString*" sizeop="sizeof_unicode(%)"/>
 268 
 269     <!-- Symbol* constant. Note that this may currently ONLY be used by
 270           classes, methods fields.  This restriction might be lifted. -->
 271     <primary_type symbol="SYMBOL" datatype="U8" contenttype="SYMBOL"
 272                   type="Symbol *" sizeop="sizeof(u8)"/>
 273 
 274     <!-- A Klass *. The actual class is marked as "used" and will
 275          eventually be written into the recording constant pool -->
 276     <primary_type symbol="CLASS" datatype="U8" contenttype="CLASS"
 277                   type="Klass *" sizeop="sizeof(u8)"/>
 278 
 279     <!-- A Method *. The method is marked as "used" and will eventually be
 280          written into the recording constant pool. -->
 281     <primary_type symbol="METHOD" datatype="U8" contenttype="METHOD"
 282                   type="Method *" sizeop="sizeof(u8)"/>
 283 
 284     <!--  The type for stacktraces in the recording. Shoudl not be used by
 285           events explicitly -->
 286     <primary_type symbol="STACKTRACE" datatype="U8" contenttype="STACKTRACE"
 287                   type="u8" sizeop="sizeof(u8)"/>
 288 
 289     <!-- OS Thread ID -->
 290     <primary_type symbol="OSTHREAD" datatype="U4" contenttype="OSTHREAD"
 291                   type="u4" sizeop="sizeof(u4)"/>
 292 
 293     <!-- VM Thread ID Note: changed from U2 to U8 for hotspot -->
 294     <primary_type symbol="VMTHREAD" datatype="U8" contenttype="VMTHREAD"
 295                   type="u8"  sizeop="sizeof(u8)"/>
 296 
 297     <!-- Java Thread ID -->
 298     <primary_type symbol="JAVALANGTHREAD" datatype="LONG"
 299                   contenttype="JAVALANGTHREAD" type="s8"
 300                   sizeop="sizeof(s8)"/>
 301 
 302     <!-- Threadgroup THIS TYPE MAY NOT BE USED IN NORMAL EVENTS (ATM). Only
 303           for thread constant pool // KK TODO: u8 should be ObjectP -->
 304     <primary_type symbol="THREADGROUP" datatype="U4" contenttype="THREADGROUP"
 305                   type="u8"
 306                   sizeop="sizeof(u4)"/>
 307 
 308     <!-- FRAMETYPE enum -->
 309     <primary_type symbol="FRAMETYPE" datatype="U1" contenttype="FRAMETYPE"
 310                   type="u1" sizeop="sizeof(u1)"/>
 311 
 312     <!-- THREADSTATE enum -->
 313     <primary_type symbol="THREADSTATE" datatype="U2" contenttype="THREADSTATE"
 314                   type="u2" sizeop="sizeof(u2)"/>
 315 
 316     <!-- GCName -->
 317     <primary_type symbol="GCNAME" datatype="U1" contenttype="GCNAME"
 318                   type="u1" sizeop="sizeof(u1)" />
 319 
 320     <!-- GCCAUSE -->
 321     <primary_type symbol="GCCAUSE" datatype="U2" contenttype="GCCAUSE"
 322                   type="u2" sizeop="sizeof(u2)" />
 323 
 324     <!-- GCWHEN -->
 325     <primary_type symbol="GCWHEN" datatype="U1" contenttype="GCWHEN"
 326                   type="u1" sizeop="sizeof(u1)" />
 327 
 328     <!-- G1YCType -->
 329     <primary_type symbol="G1YCTYPE" datatype="U1" contenttype="G1YCTYPE"
 330                   type="u1" sizeop="sizeof(u1)" />
 331 
 332     <!-- GCTHRESHOLDUPDATER -->
 333     <primary_type symbol="GCTHRESHOLDUPDATER" datatype="U1" contenttype="GCTHRESHOLDUPDATER"
 334                   type="u1" sizeop="sizeof(u1)" />
 335 
 336     <!-- REFERENCETYPE -->
 337     <primary_type symbol="REFERENCETYPE" datatype="U1"
 338                   contenttype="REFERENCETYPE" type="u1" sizeop="sizeof(u1)" />
 339 
 340     <!-- NARROWOOPMODE -->
 341     <primary_type symbol="NARROWOOPMODE" datatype="U1"
 342                   contenttype="NARROWOOPMODE" type="u1" sizeop="sizeof(u1)" />
 343 
 344     <!-- COMPILERPHASETYPE -->
 345     <primary_type symbol="COMPILERPHASETYPE" datatype="U1"
 346                   contenttype="COMPILERPHASETYPE" type="u1" sizeop="sizeof(u1)" />
 347 
 348     <!-- VMOPERATIONTYPE -->
 349     <primary_type symbol="VMOPERATIONTYPE" datatype="U2" contenttype="VMOPERATIONTYPE"
 350                   type="u2" sizeop="sizeof(u2)" />
 351                   
 352     <!-- FLAGVALUEORIGIN -->
 353     <primary_type symbol="FLAGVALUEORIGIN" datatype="U1"
 354                   contenttype="FLAGVALUEORIGIN" type="u1" sizeop="sizeof(u1)" />
 355 
 356   </primary_types>
 357 </types>