TProcessID

TProcessID.txt

// Format of TProcessID record in release 3.02.06.
// Will be present if there are any referenced objects.
// ----------TKey---------------
//   byte 0->3  Nbytes   = Number of bytes in compressed record (Tkey+data)   TKey::fNbytes
//        4->5  Version  = TKey class version identifier                      TKey::fVersion
//        6->9  ObjLen   = Number of bytes of uncompressed data               TKey::fObjLen
//       10->13 Datime   = Date and time when record was written to file      TKey::fDatime
//                       | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
//       14->15 KeyLen   = Number of bytes in key structure (TKey)            TKey::fKeyLen
//       16->17 Cycle    = Cycle of key                                       TKey::fCycle
//       18->21 SeekKey  = Byte offset of record itself (consistency check)   TKey::fSeekKey
//       22->25 SeekPdir = Byte offset of parent directory record             TKey::fSeekPdir
//       26->26 lname    = Number of bytes in the class name (10)             TKey::fClassName
//       27->36 ClassName= Object Class Name ("TProcessID")                   TKey::fClassName
//       37->37 lname    = Number of bytes in the object name                 TNamed::fName
//       38->.. Name     = lName bytes with the name of the object            TNamed::fName
//                       | (e.g. "ProcessID0")
//        0->0  lTitle   = Number of bytes in the object title                TNamed::fTitle
//        1->.. Title    = lTitle bytes with the title of the object          TNamed::fTitle
//                       | (Identifies processor, time stamp, etc.)
//                       | See detailed explanation below.
// ----------DATA--------------
//        0->3 ByteCount = Number of remaining bytes in TProcessID object (uncompressed)
//                       |   OR'd with kByteCountMask (0x40000000)
//        4->5 Version   = Version of TProcessID Class
// -Begin TNamed object (Base class of TProcessID)
//        6->9 ByteCount = Number of remaining bytes in TNamed object (uncompressed)
//                       |   OR'd with kByteCountMask (0x40000000)
//       10->11 Version  = Version of TNamed Class
//       12->21          = TObject object (Base class of TNamed) (see tobject.txt).
//                       |   The TProcessID object is not itself referenced.
//       22->22 lname    = Number of bytes in the object name                 TNamed::fName
//       23->.. Name     = lName bytes with the name of the object            TNamed::fName
//                       | The name will be "ProcessID" concatenated with
//                       | a decimal integer, or "pidf".
//        0->0  lTitle   = Number of bytes in the object title                TNamed::fTitle
//        1->.. Title    = lTitle bytes with the title of the object          TNamed::fTitle
//                       | (Identifies processor, time stamp, etc.)
//                       | See detailed explanation below.
// -End TNamed object
//
//     ----------Explanation of the title of a TProcessID object-----------------
// The title of a TProcessID object is a globally unique identifier of the
// ROOTIO process that created it.  It is derived from the following quantities.
//
// 1) The creation time ("fTime) of the TProcessID record.  This is a 60 bit time
// in 100ns ticks since Oct. 15, 1582.
//
// 2) A 16 bit random unsigned integer ("clockeq") generated from a seed that is the
//      job's process ID.  The highest two bits are not used.
//
// 3) A six byte unsigned quantity ("fNode") identifying the machine.  If the machine has a
// valid network address, the first four bytes are set to that address, and the last two bytes
// are stuffed with 0xbe and 0xef respectively.  Otherwise a six byte quantity is generated
// from the time and random machine statistics. In this case, the high order bit of the
// first byte is set to 1, to distinguish it from a network ID, where the bytes can be
// no larger than 255.
//
// We the define the following quantities (class TUUID):
        UInt_t    fTimeLow;               // 60 bit time, lowest 32 bits
        UShort_t  fTimeMid;               // 60 bit time, middle 16 bits
        UShort_t  fTimeHiAndVersion;      // 60 bit time, highest 12 time bits (low 12 bits)
                                          // + 4 UUID version bits (high 4 bits)
                                          // version is 1 if machine has valid network address
                                          // and 3 otherwise.
        UChar_t   fClockSeqHiAndReserved; // high 6 clockseq bits (low 6 bits)
                                          // + 2 high bits reserved (currently set to binary 10)
        UChar_t   fClockSeqLow;           // low 8 clockseq bits
        UChar_t   fNode[6];               // 6 node (machine) id bytes

// Then the following sprintf() call defines the format of the title string:
   sprintf(Title, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
           fTimeLow, fTimeMid, fTimeHiAndVersion, fClockSeqHiAndReserved,
           fClockSeqLow, fNode[0], fNode[1], fNode[2], fNode[3], fNode[4],
           fNode[5]);
// Since the title written to disk is preceded by its byte count, the delimiting null is not written.