1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  | 
#pragma once
#include <util/generic/vector.h>
#include <util/stream/output.h>
#ifndef NALF_ALLOC_DEFAULTMODE
#define NALF_ALLOC_DEFAULTMODE (TAllocHint::Chunked)
#endif
#ifndef NALF_ALLOC_DEFAULTALIGN
#define NALF_ALLOC_DEFAULTALIGN (16)
#endif
#if defined(_tsan_enabled_) || defined(_msan_enabled_) || defined(_asan_enabled_) || defined(WITH_VALGRIND)
#define NALF_FORCE_MALLOC_FREE 1
#define NALF_DONOT_DEFINE_GLOBALS 1
#endif
namespace NNumaAwareLockFreeAllocator {
    struct TAllocHint {
        enum EHint {
            Undefined,
            Incremental,
            Chunked,
            System,
            ForceIncremental,
            ForceChunked,
            ForceSystem,
            Bootstrap,
        };
        // valid op hint values: incremental, chunked, system, force*
        // valid thread hint values: undefined, incremental, chunked, system
        // bootstrap is used in node initialization only
    };
    class TPerThreadAllocator;
    TPerThreadAllocator* GetThreadAllocator();
    void* Allocate(ui64 len, TAllocHint::EHint hint = NALF_ALLOC_DEFAULTMODE, ui64 align = NALF_ALLOC_DEFAULTALIGN);
    void Free(void* mem);
    void* Realloc(void* mem, ui64 len);
    TAllocHint::EHint SwapHint(TAllocHint::EHint hint) noexcept;
    std::pair<ui64, TAllocHint::EHint> MemBlockSize(void* mem);
    void* Allocate(TPerThreadAllocator* pta, ui64 len, TAllocHint::EHint hint = NALF_ALLOC_DEFAULTMODE, ui64 align = NALF_ALLOC_DEFAULTALIGN);
    void Free(TPerThreadAllocator* pta, void* mem);
    void* Realloc(TPerThreadAllocator* pta, void* mem, ui64 len);
    TAllocHint::EHint SwapHint(TPerThreadAllocator* pta, TAllocHint::EHint hint) noexcept;
    template <TAllocHint::EHint Hint>
    struct TSwapHint : TNonCopyable {
        const TAllocHint::EHint Old;
        TSwapHint()
            : Old(SwapHint(Hint))
        {
        }
        ~TSwapHint() {
            SwapHint(Old);
        }
    };
    void* SystemAllocation(ui64 size);
    void SystemFree(void* mem, ui64 size);
    void* SystemRemap(void* mem, ui64 oldsize, ui64 newsize);
    ui32 GetNumaNode();
    struct TAllocatorStats {
        ui64 TotalBytesReserved; // w/o system bytes!
        ui32 PerThreadEntries;
        struct TSizeStats {
            ui32 PageSize;
            ui32 ChunkSize;
            ui64 TotalPagesReserved;
            ui64 TotalPagesCached;
            ui64 TotalAllocations;
            ui64 TotalReclaimed;
            ui64 PagesClaimed;
            ui64 PagesFromCache;
            ui64 PagesReleased;
            TSizeStats();
        };
        struct TIncrementalStats {
            ui64 TotalPagesReserved;
            ui64 TotalPagesCached;
            ui64 TotalAllocations;
            ui64 TotalReclaimed;
            ui64 PagesClaimed;
            ui64 PagesFromCache;
            ui64 PagesReleased;
            TIncrementalStats();
        };
        struct TSysStats {
            ui64 TotalBytesReserved;
            ui64 TotalBytesCached;
            ui64 TotalAllocations;
            ui64 TotalReclaimed;
            TSysStats();
        };
        TVector<TSizeStats> BySizeStats;
        TIncrementalStats IncrementalStats;
        TSysStats SysStats;
        TAllocatorStats();
        void Out(IOutputStream& out) const;
    };
    TVector<TAllocatorStats> GetAllocatorStats(); // one entry per numa-node
    static const ui64 SystemPageSize = 4096;
}
  |