Adjust and optimize the size class properties for the given class
| 1256 | |
| 1257 | //! Adjust and optimize the size class properties for the given class |
| 1258 | static void |
| 1259 | _memory_adjust_size_class(size_t iclass) { |
| 1260 | //Calculate how many pages are needed for 255 blocks |
| 1261 | size_t block_size = _memory_size_class[iclass].size; |
| 1262 | size_t page_count = (block_size * 255) / PAGE_SIZE; |
| 1263 | //Cap to 16 pages (64KiB span granularity) |
| 1264 | page_count = (page_count == 0) ? 1 : ((page_count > 16) ? 16 : page_count); |
| 1265 | //Merge page counts to span size class granularity |
| 1266 | page_count = ((page_count + (SPAN_CLASS_GRANULARITY - 1)) / SPAN_CLASS_GRANULARITY) * SPAN_CLASS_GRANULARITY; |
| 1267 | if (page_count > 16) |
| 1268 | page_count = 16; |
| 1269 | size_t block_count = ((page_count * PAGE_SIZE) - SPAN_HEADER_SIZE) / block_size; |
| 1270 | //Store the final configuration |
| 1271 | _memory_size_class[iclass].page_count = (uint16_t)page_count; |
| 1272 | _memory_size_class[iclass].block_count = (uint16_t)block_count; |
| 1273 | _memory_size_class[iclass].class_idx = (uint16_t)iclass; |
| 1274 | |
| 1275 | //Check if previous size classes can be merged |
| 1276 | size_t prevclass = iclass; |
| 1277 | while (prevclass > 0) { |
| 1278 | --prevclass; |
| 1279 | //A class can be merged if number of pages and number of blocks are equal |
| 1280 | if ((_memory_size_class[prevclass].page_count == _memory_size_class[iclass].page_count) && |
| 1281 | (_memory_size_class[prevclass].block_count == _memory_size_class[iclass].block_count)) { |
| 1282 | memcpy(_memory_size_class + prevclass, _memory_size_class + iclass, sizeof(_memory_size_class[iclass])); |
| 1283 | } |
| 1284 | else { |
| 1285 | break; |
| 1286 | } |
| 1287 | } |
| 1288 | } |
| 1289 | |
| 1290 | #if defined( _WIN32 ) || defined( __WIN32__ ) || defined( _WIN64 ) |
| 1291 | # include <windows.h> |
no outgoing calls
no test coverage detected