2#ifndef POSIX_ACCOUNTING_RECORD_H
3#define POSIX_ACCOUNTING_RECORD_H
8namespace PosixAccounting {
9constexpr uint64_t TickNanoseconds = 10000000;
14 uint16_t terminal = 0;
15 uint32_t exitStatus = 0;
16 uint32_t uid = 0, gid = 0, pid = 0, parentPid = 0;
17 uint32_t birthSeconds = 0;
18 uint32_t elapsedFloat = 0;
19 uint16_t userTicks = 0, systemTicks = 0, memory = 0;
20 uint16_t io = 0, blocks = 0, minorFaults = 0, majorFaults = 0, swaps = 0;
21 char command[16] = {};
23static_assert(
sizeof(
Record) == 64 && offsetof(
Record, command) == 48,
24 "Linux acct_v3 record layout changed");
26inline uint16_t compressed(uint64_t value) {
28 for (
unsigned exponent = 0; exponent != 8; ++exponent) {
29 const unsigned shift = exponent * 3;
30 const uint64_t unit = uint64_t(1) << shift;
31 uint64_t mantissa = value >> shift;
32 if (shift && (value & (unit - 1)) >= unit / 2)
35 return static_cast<uint16_t
>((exponent << 13) | mantissa);
40inline uint32_t floatBits(uint64_t value) {
46 for (uint64_t bits = value; bits >>= 1;)
48 const uint32_t significand = top > 23 ?
static_cast<uint32_t
>(value >> (top - 23))
49 : static_cast<uint32_t>(value << (23 - top));
50 return ((top + 127) << 23) | (significand & 0x7fffff);