226 }
227
228 static MallocMemorySnapshot* as_snapshot() {
229 return (MallocMemorySnapshot*)_snapshot;
230 }
231 };
232
233
234 /*
235 * Malloc tracking header.
236 * To satisfy malloc alignment requirement, NMT uses 2 machine words for tracking purpose,
237 * which ensures 8-bytes alignment on 32-bit systems and 16-bytes on 64-bit systems (Product build).
238 */
239
240 class MallocHeader VALUE_OBJ_CLASS_SPEC {
241 #ifdef _LP64
242 size_t _size : 64;
243 size_t _flags : 8;
244 size_t _pos_idx : 16;
245 size_t _bucket_idx: 40;
246 #define MAX_MALLOCSITE_TABLE_SIZE ((size_t)1 << 40)
247 #define MAX_BUCKET_LENGTH ((size_t)(1 << 16))
248 #else
249 size_t _size : 32;
250 size_t _flags : 8;
251 size_t _pos_idx : 8;
252 size_t _bucket_idx: 16;
253 #define MAX_MALLOCSITE_TABLE_SIZE ((size_t)(1 << 16))
254 #define MAX_BUCKET_LENGTH ((size_t)(1 << 8))
255 #endif // _LP64
256
257 public:
258 MallocHeader(size_t size, MEMFLAGS flags, const NativeCallStack& stack, NMT_TrackingLevel level) {
259 assert(sizeof(MallocHeader) == sizeof(void*) * 2,
260 "Wrong header size");
261
262 if (level == NMT_minimal) {
263 return;
264 }
265
266 _flags = flags;
267 set_size(size);
268 if (level == NMT_detail) {
269 size_t bucket_idx;
270 size_t pos_idx;
271 if (record_malloc_site(stack, size, &bucket_idx, &pos_idx)) {
272 assert(bucket_idx <= MAX_MALLOCSITE_TABLE_SIZE, "Overflow bucket index");
273 assert(pos_idx <= MAX_BUCKET_LENGTH, "Overflow bucket position index");
274 _bucket_idx = bucket_idx;
|
226 }
227
228 static MallocMemorySnapshot* as_snapshot() {
229 return (MallocMemorySnapshot*)_snapshot;
230 }
231 };
232
233
234 /*
235 * Malloc tracking header.
236 * To satisfy malloc alignment requirement, NMT uses 2 machine words for tracking purpose,
237 * which ensures 8-bytes alignment on 32-bit systems and 16-bytes on 64-bit systems (Product build).
238 */
239
240 class MallocHeader VALUE_OBJ_CLASS_SPEC {
241 #ifdef _LP64
242 size_t _size : 64;
243 size_t _flags : 8;
244 size_t _pos_idx : 16;
245 size_t _bucket_idx: 40;
246 #define MAX_MALLOCSITE_TABLE_SIZE right_n_bits(40)
247 #define MAX_BUCKET_LENGTH right_n_bits(16)
248 #else
249 size_t _size : 32;
250 size_t _flags : 8;
251 size_t _pos_idx : 8;
252 size_t _bucket_idx: 16;
253 #define MAX_MALLOCSITE_TABLE_SIZE right_n_bits(16)
254 #define MAX_BUCKET_LENGTH right_n_bits(8)
255 #endif // _LP64
256
257 public:
258 MallocHeader(size_t size, MEMFLAGS flags, const NativeCallStack& stack, NMT_TrackingLevel level) {
259 assert(sizeof(MallocHeader) == sizeof(void*) * 2,
260 "Wrong header size");
261
262 if (level == NMT_minimal) {
263 return;
264 }
265
266 _flags = flags;
267 set_size(size);
268 if (level == NMT_detail) {
269 size_t bucket_idx;
270 size_t pos_idx;
271 if (record_malloc_site(stack, size, &bucket_idx, &pos_idx)) {
272 assert(bucket_idx <= MAX_MALLOCSITE_TABLE_SIZE, "Overflow bucket index");
273 assert(pos_idx <= MAX_BUCKET_LENGTH, "Overflow bucket position index");
274 _bucket_idx = bucket_idx;
|