mirror of
https://github.com/memtest86plus/memtest86plus.git
synced 2025-02-16 13:34:45 -06:00
Fix the behaviour of sort_pm_map() (issue #392)
The existing algorithm both read and wrote data beyond the end of the array and, when moving data, moved it in the wrong direction. Replace it with a bog-standard insertion sort algorithm. The resulting code is smaller and probably faster, as memmove() is not in-lined.
This commit is contained in:
parent
53ca89f8ae
commit
778c7b4cc4
@ -1,5 +1,5 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
// Copyright (C) 2020-2022 Martin Whitaker.
|
// Copyright (C) 2020-2024 Martin Whitaker.
|
||||||
//
|
//
|
||||||
// Derived from memtest86+ memsize.c
|
// Derived from memtest86+ memsize.c
|
||||||
//
|
//
|
||||||
@ -225,23 +225,14 @@ static void init_pm_map(const e820_entry_t e820_map[], int e820_entries)
|
|||||||
static void sort_pm_map(void)
|
static void sort_pm_map(void)
|
||||||
{
|
{
|
||||||
// Do an insertion sort on the pm_map. On an already sorted list this should be a O(n) algorithm.
|
// Do an insertion sort on the pm_map. On an already sorted list this should be a O(n) algorithm.
|
||||||
for (int i = 0; i < pm_map_size; i++) {
|
for (int i = 1; i < pm_map_size; i++) {
|
||||||
// Find where to insert the current element.
|
pm_map_t candidate = pm_map[i];
|
||||||
int j = i - 1;
|
int j = i;
|
||||||
while (j >= 0) {
|
while ((j > 0) && (pm_map[j-1].start > candidate.start)) {
|
||||||
if (pm_map[i].start > pm_map[j].start) {
|
pm_map[j] = pm_map[j-1];
|
||||||
j++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
j--;
|
j--;
|
||||||
}
|
}
|
||||||
// Insert the current element.
|
pm_map[j] = candidate;
|
||||||
if (i != j) {
|
|
||||||
pm_map_t temp;
|
|
||||||
temp = pm_map[i];
|
|
||||||
memmove(&pm_map[j], &pm_map[j+1], (i - j) * sizeof(temp));
|
|
||||||
pm_map[j] = temp;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user