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.