mirror of https://github.com/microsoft/mimalloc
fix valgrind tracking for zero initialized segments
This commit is contained in:
parent
8184e9de1f
commit
a90737a7fa
|
@ -796,8 +796,6 @@ static mi_segment_t* mi_segment_os_alloc( size_t required, size_t page_alignment
|
||||||
const size_t extra = align_offset - info_size;
|
const size_t extra = align_offset - info_size;
|
||||||
// recalculate due to potential guard pages
|
// recalculate due to potential guard pages
|
||||||
*psegment_slices = mi_segment_calculate_slices(required + extra, ppre_size, pinfo_slices);
|
*psegment_slices = mi_segment_calculate_slices(required + extra, ppre_size, pinfo_slices);
|
||||||
//segment_size += _mi_align_up(align_offset - info_size, MI_SEGMENT_SLICE_SIZE);
|
|
||||||
//segment_slices = segment_size / MI_SEGMENT_SLICE_SIZE;
|
|
||||||
}
|
}
|
||||||
const size_t segment_size = (*psegment_slices) * MI_SEGMENT_SLICE_SIZE;
|
const size_t segment_size = (*psegment_slices) * MI_SEGMENT_SLICE_SIZE;
|
||||||
mi_segment_t* segment = NULL;
|
mi_segment_t* segment = NULL;
|
||||||
|
@ -831,7 +829,10 @@ static mi_segment_t* mi_segment_os_alloc( size_t required, size_t page_alignment
|
||||||
if (!ok) return NULL; // failed to commit
|
if (!ok) return NULL; // failed to commit
|
||||||
mi_commit_mask_set(pcommit_mask, &commit_needed_mask);
|
mi_commit_mask_set(pcommit_mask, &commit_needed_mask);
|
||||||
}
|
}
|
||||||
mi_track_mem_undefined(segment,commit_needed*MI_COMMIT_SIZE);
|
else if (*is_zero) {
|
||||||
|
// track zero initialization for valgrind
|
||||||
|
mi_track_mem_defined(segment, commit_needed * MI_COMMIT_SIZE);
|
||||||
|
}
|
||||||
segment->memid = memid;
|
segment->memid = memid;
|
||||||
segment->mem_is_pinned = is_pinned;
|
segment->mem_is_pinned = is_pinned;
|
||||||
segment->mem_is_large = mem_large;
|
segment->mem_is_large = mem_large;
|
||||||
|
@ -874,18 +875,14 @@ static mi_segment_t* mi_segment_alloc(size_t required, size_t page_alignment, mi
|
||||||
if (segment == NULL) return NULL;
|
if (segment == NULL) return NULL;
|
||||||
|
|
||||||
// zero the segment info? -- not always needed as it may be zero initialized from the OS
|
// zero the segment info? -- not always needed as it may be zero initialized from the OS
|
||||||
mi_track_mem_defined(segment, offsetof(mi_segment_t, next)); // needed for valgrind
|
|
||||||
mi_atomic_store_ptr_release(mi_segment_t, &segment->abandoned_next, NULL); // tsan
|
mi_atomic_store_ptr_release(mi_segment_t, &segment->abandoned_next, NULL); // tsan
|
||||||
{
|
{
|
||||||
ptrdiff_t ofs = offsetof(mi_segment_t, next);
|
ptrdiff_t ofs = offsetof(mi_segment_t, next);
|
||||||
size_t prefix = offsetof(mi_segment_t, slices) - ofs;
|
size_t prefix = offsetof(mi_segment_t, slices) - ofs;
|
||||||
size_t zsize = prefix + sizeof(mi_slice_t) * (segment_slices + 1); // one more
|
size_t zsize = prefix + (sizeof(mi_slice_t) * (segment_slices + 1)); // one more
|
||||||
if (!is_zero) {
|
if (!is_zero) {
|
||||||
memset((uint8_t*)segment + ofs, 0, zsize);
|
memset((uint8_t*)segment + ofs, 0, zsize);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
mi_track_mem_defined((uint8_t*)segment + ofs, zsize); // todo: somehow needed for valgrind?
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
segment->commit_mask = commit_mask; // on lazy commit, the initial part is always committed
|
segment->commit_mask = commit_mask; // on lazy commit, the initial part is always committed
|
||||||
|
|
Loading…
Reference in New Issue