minor perf improvements related to issue #51 · struct/isoalloc@049c12e (original) (raw)
`@@ -741,7 +741,7 @@ INTERNAL_HIDDEN bit_slot_t iso_scan_zone_free_slot_slow(iso_alloc_zone *zone) {
`
741
741
``
742
742
`INTERNAL_HIDDEN iso_alloc_zone *is_zone_usable(iso_alloc_zone *zone, size_t size) {
`
743
743
`/* This zone may fit this chunk but if the zone was
`
744
``
`-
- created for chunks more than N* larger than the
`
``
744
`+
- created for chunks more than (N * larger) than the
`
745
745
` * requested allocation size then we would be wasting
`
746
746
` * a lot of memory by using it. We only do this for
`
747
747
` * sizes beyond ZONE_1024 bytes. In other words we can
`
`@@ -837,9 +837,9 @@ INTERNAL_HIDDEN iso_alloc_zone *iso_find_zone_fit(size_t size) {
`
837
837
` * slower iterative approach is used. The longer a
`
838
838
` * program runs the more likely we will fail this
`
839
839
` * fast path as default zones may fill up */
`
840
``
`-
if(size >= ZONE_512 && size <= ZONE_8192) {
`
``
840
`+
if(size >= ZONE_512 && size <= MAX_DEFAULT_ZONE_SZ) {
`
841
841
`i = _default_zone_count >> 1;
`
842
``
`-
} else if(size > ZONE_8192) {
`
``
842
`+
} else if(size > MAX_DEFAULT_ZONE_SZ) {
`
843
843
`i = _default_zone_count;
`
844
844
` }
`
845
845
`#endif
`
`@@ -1038,6 +1038,7 @@ INTERNAL_HIDDEN INLINE size_t next_pow2(size_t sz) {
`
1038
1038
`return sz + 1;
`
1039
1039
`}
`
1040
1040
``
``
1041
`+
/* Populates the thread cache, requires the root is locked and zone is unmasked */
`
1041
1042
`INTERNAL_HIDDEN INLINE void populate_thread_caches(iso_alloc_zone *zone) {
`
1042
1043
`#if THREAD_SUPPORT && THREAD_CACHE
`
1043
1044
`if(thread_bit_slot_cache.chunk == NULL) {
`
`@@ -1051,6 +1052,11 @@ INTERNAL_HIDDEN INLINE void populate_thread_caches(iso_alloc_zone *zone) {
`
1051
1052
` }
`
1052
1053
` }
`
1053
1054
``
``
1055
`+
/* Don't cache this zone if it was recently cached */
`
``
1056
`+
if(thread_zone_cache_count != 0 && thread_zone_cache[thread_zone_cache_count - 1].zone == zone) {
`
``
1057
`+
return;
`
``
1058
`+
}
`
``
1059
+
1054
1060
`if(thread_zone_cache_count < THREAD_ZONE_CACHE_SZ) {
`
1055
1061
`thread_zone_cache[thread_zone_cache_count].zone = zone;
`
1056
1062
`thread_zone_cache[thread_zone_cache_count].chunk_size = zone->chunk_size;
`
`@@ -1065,7 +1071,8 @@ INTERNAL_HIDDEN INLINE void populate_thread_caches(iso_alloc_zone *zone) {
`
1065
1071
``
1066
1072
`INTERNAL_HIDDEN void *_iso_alloc(iso_alloc_zone *zone, size_t size) {
`
1067
1073
`#if THREAD_SUPPORT && THREAD_CACHE
`
1068
``
`-
if(LIKELY(zone == NULL) && size <= SMALL_SZ_MAX && thread_bit_slot_cache.chunk_size >= size && thread_bit_slot_cache.chunk != NULL) {
`
``
1074
`+
if(LIKELY(zone == NULL) && size <= SMALL_SZ_MAX && thread_bit_slot_cache.chunk_size >= size &&
`
``
1075
`+
thread_bit_slot_cache.chunk != NULL) {
`
1069
1076
`void *p = thread_bit_slot_cache.chunk;
`
1070
1077
`thread_bit_slot_cache.chunk = NULL;
`
1071
1078
`thread_bit_slot_cache.chunk_size = 0;
`
`@@ -1143,10 +1150,10 @@ INTERNAL_HIDDEN void *_iso_alloc(iso_alloc_zone *zone, size_t size) {
`
1143
1150
`zone = iso_find_zone_fit(size);
`
1144
1151
` }
`
1145
1152
``
1146
``
`-
if(zone != NULL) {
`
1147
``
`-
/* We only need to check if the zone is usable
`
1148
``
`-
- if it's a custom zone. If we chose this zone
`
1149
``
`-
- then its guaranteed to already be usable */
`
``
1153
`+
/* We only need to check if the zone is usable
`
``
1154
`+
- if it's a custom zone. If we chose this zone
`
``
1155
`+
- then its guaranteed to already be usable */
`
``
1156
`+
if(LIKELY(zone != NULL)) {
`
1150
1157
`if(zone->internally_managed == false) {
`
1151
1158
`zone = is_zone_usable(zone, size);
`
1152
1159
``