mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-07-01 17:24:38 +03:00
add comments
This commit is contained in:
parent
dd3a74d89d
commit
7e721c881b
2 changed files with 9 additions and 4 deletions
11
src/bitmap.c
11
src/bitmap.c
|
@ -1557,7 +1557,7 @@ static inline bool mi_bbitmap_try_find_and_clear_generic(mi_bbitmap_t* bbitmap,
|
||||||
mi_assert_internal(MI_BFIELD_BITS >= MI_BCHUNK_FIELDS);
|
mi_assert_internal(MI_BFIELD_BITS >= MI_BCHUNK_FIELDS);
|
||||||
const mi_bfield_t cmap_mask = mi_bfield_mask(cmap_max_count,0);
|
const mi_bfield_t cmap_mask = mi_bfield_mask(cmap_max_count,0);
|
||||||
const size_t cmap_cycle = cmap_acc+1;
|
const size_t cmap_cycle = cmap_acc+1;
|
||||||
const mi_bbin_t bbin = mi_bbin_of(n);
|
const mi_bbin_t bbin = mi_bbin_of(n);
|
||||||
// visit each cmap entry
|
// visit each cmap entry
|
||||||
size_t cmap_idx = 0;
|
size_t cmap_idx = 0;
|
||||||
mi_bfield_cycle_iterate(cmap_mask, tseq, cmap_cycle, cmap_idx, X)
|
mi_bfield_cycle_iterate(cmap_mask, tseq, cmap_cycle, cmap_idx, X)
|
||||||
|
@ -1576,11 +1576,15 @@ static inline bool mi_bbitmap_try_find_and_clear_generic(mi_bbitmap_t* bbitmap,
|
||||||
cmap_bins[MI_BBIN_NONE] &= ~cmap_bin; // clear bits that are in an assigned size bin
|
cmap_bins[MI_BBIN_NONE] &= ~cmap_bin; // clear bits that are in an assigned size bin
|
||||||
}
|
}
|
||||||
|
|
||||||
// consider only chunks for a particular size bin at a time
|
// consider only chunks for a particular size bin at a time
|
||||||
|
// this picks the best bin only within a cmap entry (~ 1GiB address space), but avoids multiple
|
||||||
|
// iterations through all entries.
|
||||||
|
mi_assert_internal(bbin < MI_BBIN_NONE);
|
||||||
for (mi_bbin_t ibin = MI_BBIN_SMALL; ibin <= MI_BBIN_NONE;
|
for (mi_bbin_t ibin = MI_BBIN_SMALL; ibin <= MI_BBIN_NONE;
|
||||||
// skip from bbin to NONE (so, say, a SMALL will never be placed in a OTHER, MEDIUM, or LARGE chunk to reduce fragmentation)
|
// skip from bbin to NONE (so, say, a SMALL will never be placed in a OTHER, MEDIUM, or LARGE chunk to reduce fragmentation)
|
||||||
ibin = (ibin == bbin ? MI_BBIN_NONE : mi_bbin_inc(ibin)))
|
ibin = (ibin == bbin ? MI_BBIN_NONE : mi_bbin_inc(ibin)))
|
||||||
{
|
{
|
||||||
|
mi_assert_internal(ibin < MI_BBIN_COUNT);
|
||||||
const mi_bfield_t cmap_bin = cmap_bins[ibin];
|
const mi_bfield_t cmap_bin = cmap_bins[ibin];
|
||||||
size_t eidx = 0;
|
size_t eidx = 0;
|
||||||
mi_bfield_cycle_iterate(cmap_bin, tseq, cmap_entry_cycle, eidx, Y)
|
mi_bfield_cycle_iterate(cmap_bin, tseq, cmap_entry_cycle, eidx, Y)
|
||||||
|
@ -1603,7 +1607,8 @@ static inline bool mi_bbitmap_try_find_and_clear_generic(mi_bbitmap_t* bbitmap,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* we may find that all are cleared only on a second iteration but that is ok as the chunkmap is a conservative approximation. */
|
// todo: should _on_find_ return a boolen if there is a chance all are clear to avoid calling `try_clear?`
|
||||||
|
// we may find that all are cleared only on a second iteration but that is ok as the chunkmap is a conservative approximation.
|
||||||
mi_bbitmap_chunkmap_try_clear(bbitmap, chunk_idx);
|
mi_bbitmap_chunkmap_try_clear(bbitmap, chunk_idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,7 +248,7 @@ typedef mi_decl_align(MI_BCHUNK_SIZE) struct mi_bbitmap_s {
|
||||||
_Atomic(size_t) chunk_max_accessed; // max chunk index that was once cleared or set
|
_Atomic(size_t) chunk_max_accessed; // max chunk index that was once cleared or set
|
||||||
size_t _padding[MI_BCHUNK_SIZE/MI_SIZE_SIZE - 2]; // suppress warning on msvc
|
size_t _padding[MI_BCHUNK_SIZE/MI_SIZE_SIZE - 2]; // suppress warning on msvc
|
||||||
mi_bchunkmap_t chunkmap;
|
mi_bchunkmap_t chunkmap;
|
||||||
mi_bchunkmap_t chunkmap_bins[MI_BBIN_COUNT - 1]; // chunkmaps with bit set if the chunk is in that size class (except MI_BBIN_NONE)
|
mi_bchunkmap_t chunkmap_bins[MI_BBIN_COUNT - 1]; // chunkmaps with bit set if the chunk is in that size class (excluding MI_BBIN_NONE)
|
||||||
mi_bchunk_t chunks[MI_BITMAP_DEFAULT_CHUNK_COUNT]; // usually dynamic MI_BITMAP_MAX_CHUNK_COUNT
|
mi_bchunk_t chunks[MI_BITMAP_DEFAULT_CHUNK_COUNT]; // usually dynamic MI_BITMAP_MAX_CHUNK_COUNT
|
||||||
} mi_bbitmap_t;
|
} mi_bbitmap_t;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue