-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathvam.h
113 lines (86 loc) · 2.75 KB
/
vam.h
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
// -*- C++ -*-
#ifndef _VAM_H_
#define _VAM_H_
#define SANITY_CHECK 1
#define DB_PRINT_TO_FILE 1
namespace VAM {
enum {
LOW_FREQ_TYPE = 0,
USE_HEADER_TYPE = 0,
};
};
#include "vamcommon.h"
#include "alignedmmapheap.h"
#include "bitmapcachingreap.h"
#include "bitmapreap.h"
#include "bytemapreap.h"
#include "cachingheap.h"
#include "freelistreap.h"
#include "frequencyheap.h"
#include "onesizeheap.h"
#include "pageclusterheap.h"
#include "partitionheap.h"
#include "reapbase.h"
#include "segfitheap.h"
#include "segsizeheap.h"
#include "splitcoalesceheap.h"
#include "twoheap.h"
#include "heaplayers.h"
using namespace VAM;
using namespace HL;
#ifdef DEBUG
#if SANITY_CHECK
template<class SuperHeap>
class SCHeap : public SanityCheckHeap<SuperHeap> {};
#else
template<class SuperHeap>
class SCHeap : public SuperHeap {};
#endif
#else
template<class SuperHeap>
class SCHeap : public SuperHeap {};
#endif
// some tunable parameters
#define PARTITION_SIZE (8 * 1024 * 1024)
#define MAX_DEDICATED_SIZE 1024
#define MAX_PAGE_ORDER 5
#define WORKHORSE_HEAP BitmapCachingReap
//#define WORKHORSE_HEAP BitmapReap
//#define WORKHORSE_HEAP BytemapReap
//#define WORKHORSE_HEAP FreelistReap
#ifdef THREAD_SAFE
template<class SuperHeap>
class ThreadSafeHeap : public LockedHeap<SpinLockType, SuperHeap> {};
#else
template<class SuperHeap>
class ThreadSafeHeap : public SuperHeap {};
#endif
inline bool high_freq_reached(size_t size, size_t count) {
return size * count > PAGE_SIZE;
}
// here is how our Vam allocator is composed
typedef TheOnePartitionHeap<MAX_PAGE_ORDER + 1, PARTITION_SIZE, PageClusterHeap<TheOneAlignedMmapHeap> > PageSourceHeap;
typedef SplitCoalesceHeap<SegFitHeap<MAX_DEDICATED_SIZE * 2>, PageSourceHeap, PARTITION_SIZE> RegularSizeHeap;
typedef ThreadSafeHeap<TwoHeap<RegularSizeHeap, PageSourceHeap, PARTITION_SIZE> > LowFreqHeap;
//typedef SegSizeHeap<MAX_DEDICATED_SIZE, ThreadSafeHeap<CachingHeap<OneSizeHeap<MAX_PAGE_ORDER, WORKHORSE_HEAP, PageSourceHeap> > > > HighFreqHeap;
typedef SegSizeHeap<MAX_DEDICATED_SIZE, ThreadSafeHeap<OneSizeHeap<MAX_PAGE_ORDER, WORKHORSE_HEAP, PageSourceHeap> > > HighFreqHeap;
typedef FrequencyHeap<MAX_DEDICATED_SIZE, high_freq_reached, LowFreqHeap, HighFreqHeap> VamHeap;
#ifdef MEMORY_TRACE
#define MEMTRACE_IN_MEMLIB
#include "tools/memtrace.h"
template<class SuperHeap>
class DenyDlsymHeap : public SuperHeap {
public:
void * malloc(size_t size) {
if (in_dlsym)
return NULL;
else
return SuperHeap::malloc(size);
}
};
class CustomAllocator : public ANSIWrapper<DenyDlsymHeap<VamHeap> > {};
#else
class CustomAllocator : public ANSIWrapper<VamHeap> {};
#endif
volatile int anyThreadCreated = 0;
#endif