2020-08-25 11:23:25 +00:00
|
|
|
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
|
|
|
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
|
|
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
|
|
|
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
|
|
|
│ │
|
2020-12-28 01:18:44 +00:00
|
|
|
│ Permission to use, copy, modify, and/or distribute this software for │
|
|
|
|
│ any purpose with or without fee is hereby granted, provided that the │
|
|
|
|
│ above copyright notice and this permission notice appear in all copies. │
|
2020-08-25 11:23:25 +00:00
|
|
|
│ │
|
2020-12-28 01:18:44 +00:00
|
|
|
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
|
|
|
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
|
|
|
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
|
|
|
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
|
|
|
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
|
|
|
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
|
|
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
|
|
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
2020-08-25 11:23:25 +00:00
|
|
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
2022-06-27 20:01:58 +00:00
|
|
|
#include "libc/calls/calls.h"
|
2022-05-18 23:41:29 +00:00
|
|
|
#include "libc/intrin/kprintf.h"
|
2023-08-14 03:31:27 +00:00
|
|
|
#include "libc/intrin/strace.internal.h"
|
2020-08-25 11:23:25 +00:00
|
|
|
#include "libc/limits.h"
|
|
|
|
#include "libc/log/check.h"
|
|
|
|
#include "libc/mem/mem.h"
|
2021-09-04 20:20:47 +00:00
|
|
|
#include "libc/runtime/memtrack.internal.h"
|
2020-08-25 11:23:25 +00:00
|
|
|
#include "libc/runtime/runtime.h"
|
|
|
|
#include "libc/stdio/stdio.h"
|
|
|
|
#include "libc/str/str.h"
|
|
|
|
#include "libc/testlib/testlib.h"
|
|
|
|
|
2022-05-18 23:41:29 +00:00
|
|
|
#define I(x, y) \
|
|
|
|
{ x, y, 0, (y - x) * FRAMESIZE + FRAMESIZE }
|
|
|
|
|
2022-07-25 05:34:13 +00:00
|
|
|
void SetUpOnce(void) {
|
2022-08-11 07:15:29 +00:00
|
|
|
ASSERT_SYS(0, 0, pledge("stdio rpath", 0));
|
2022-06-27 20:01:58 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
bool AreMemoryIntervalsOk(const struct MemoryIntervals *mm) {
|
|
|
|
/* asan runtime depends on this function */
|
|
|
|
int i;
|
|
|
|
size_t wantsize;
|
|
|
|
for (i = 0; i < mm->i; ++i) {
|
|
|
|
if (mm->p[i].y < mm->p[i].x) {
|
|
|
|
STRACE("AreMemoryIntervalsOk() y should be >= x!");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
wantsize = (size_t)(mm->p[i].y - mm->p[i].x) * FRAMESIZE;
|
|
|
|
if (!(wantsize < mm->p[i].size && mm->p[i].size <= wantsize + FRAMESIZE)) {
|
|
|
|
STRACE("AreMemoryIntervalsOk(%p) size is wrong!"
|
|
|
|
" %'zu not within %'zu .. %'zu",
|
|
|
|
(uintptr_t)mm->p[i].x << 16, mm->p[i].size, wantsize,
|
|
|
|
wantsize + FRAMESIZE);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (i) {
|
|
|
|
if (mm->p[i].h != -1 || mm->p[i - 1].h != -1) {
|
|
|
|
if (mm->p[i].x <= mm->p[i - 1].y) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (!(mm->p[i - 1].y + 1 <= mm->p[i].x)) {
|
|
|
|
STRACE("AreMemoryIntervalsOk() out of order or overlap!");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-08-25 11:23:25 +00:00
|
|
|
static bool AreMemoryIntervalsEqual(const struct MemoryIntervals *mm1,
|
|
|
|
const struct MemoryIntervals *mm2) {
|
|
|
|
if (mm1->i != mm2->i) return false;
|
|
|
|
if (memcmp(mm1->p, mm2->p, mm1->i * sizeof(*mm2->p)) != 0) return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void PrintMemoryInterval(const struct MemoryIntervals *mm) {
|
|
|
|
int i;
|
|
|
|
for (i = 0; i < mm->i; ++i) {
|
|
|
|
if (i) fprintf(stderr, ",");
|
|
|
|
fprintf(stderr, "{%d,%d}", mm->p[i].x, mm->p[i].y);
|
|
|
|
}
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void CheckMemoryIntervalsEqual(const struct MemoryIntervals *mm1,
|
|
|
|
const struct MemoryIntervals *mm2) {
|
|
|
|
if (!AreMemoryIntervalsEqual(mm1, mm2)) {
|
2022-05-18 23:41:29 +00:00
|
|
|
kprintf("got:\n");
|
|
|
|
PrintMemoryIntervals(2, mm1);
|
|
|
|
kprintf("want:\n");
|
|
|
|
PrintMemoryIntervals(2, mm2);
|
2020-08-25 11:23:25 +00:00
|
|
|
CHECK(!"memory intervals not equal");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void CheckMemoryIntervalsAreOk(const struct MemoryIntervals *mm) {
|
|
|
|
if (!AreMemoryIntervalsOk(mm)) {
|
|
|
|
PrintMemoryInterval(mm);
|
|
|
|
CHECK(!"memory intervals not ok");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void RunTrackMemoryIntervalTest(const struct MemoryIntervals t[2], int x,
|
|
|
|
int y, long h) {
|
|
|
|
struct MemoryIntervals *mm;
|
2022-04-24 16:59:22 +00:00
|
|
|
mm = memcpy(memalign(64, sizeof(*t)), t, sizeof(*t));
|
2020-08-25 11:23:25 +00:00
|
|
|
CheckMemoryIntervalsAreOk(mm);
|
2023-08-14 03:31:27 +00:00
|
|
|
CHECK_NE(-1, __track_memory(mm, x, y, h, 0, 0, 0, 0, 0,
|
|
|
|
(y - x) * FRAMESIZE + FRAMESIZE));
|
2020-08-25 11:23:25 +00:00
|
|
|
CheckMemoryIntervalsAreOk(mm);
|
|
|
|
CheckMemoryIntervalsEqual(mm, t + 1);
|
|
|
|
free(mm);
|
|
|
|
}
|
|
|
|
|
2021-01-25 21:08:05 +00:00
|
|
|
static int RunReleaseMemoryIntervalsTest(const struct MemoryIntervals t[2],
|
|
|
|
int x, int y) {
|
|
|
|
int rc;
|
2020-08-25 11:23:25 +00:00
|
|
|
struct MemoryIntervals *mm;
|
2022-04-24 16:59:22 +00:00
|
|
|
mm = memcpy(memalign(64, sizeof(*t)), t, sizeof(*t));
|
2020-08-25 11:23:25 +00:00
|
|
|
CheckMemoryIntervalsAreOk(mm);
|
2023-08-14 03:31:27 +00:00
|
|
|
if ((rc = __untrack_memory(mm, x, y, NULL)) != -1) {
|
2021-01-25 21:08:05 +00:00
|
|
|
CheckMemoryIntervalsAreOk(mm);
|
|
|
|
CheckMemoryIntervalsEqual(t + 1, mm);
|
|
|
|
}
|
2020-08-25 11:23:25 +00:00
|
|
|
free(mm);
|
2021-01-25 21:08:05 +00:00
|
|
|
return rc;
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__track_memory, TestEmpty) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
|
|
|
{0, OPEN_MAX, 0, {}},
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {{2, 2, 0, FRAMESIZE}}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2020-08-25 11:23:25 +00:00
|
|
|
RunTrackMemoryIntervalTest(mm, 2, 2, 0);
|
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__track_memory, TestFull) {
|
2021-10-15 02:36:49 +00:00
|
|
|
#if 0 // TODO(jart): Find way to re-enable
|
2020-08-25 11:23:25 +00:00
|
|
|
int i;
|
|
|
|
struct MemoryIntervals *mm;
|
|
|
|
mm = calloc(1, sizeof(struct MemoryIntervals));
|
2021-09-04 20:20:47 +00:00
|
|
|
for (i = 0; i < mm->n; ++i) {
|
2020-08-25 11:23:25 +00:00
|
|
|
CheckMemoryIntervalsAreOk(mm);
|
2023-08-14 03:31:27 +00:00
|
|
|
CHECK_NE(-1, __track_memory(mm, i, i, i, 0, 0, 0, 0, 0, 0));
|
2020-08-25 11:23:25 +00:00
|
|
|
CheckMemoryIntervalsAreOk(mm);
|
|
|
|
}
|
2023-08-14 03:31:27 +00:00
|
|
|
CHECK_EQ(-1, __track_memory(mm, i, i, i, 0, 0, 0, 0, 0, 0));
|
2020-08-25 11:23:25 +00:00
|
|
|
CHECK_EQ(ENOMEM, errno);
|
|
|
|
CheckMemoryIntervalsAreOk(mm);
|
|
|
|
free(mm);
|
2021-10-15 02:36:49 +00:00
|
|
|
#endif
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__track_memory, TestAppend) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(2, 2)}},
|
|
|
|
{1, OPEN_MAX, 0, {I(2, 3)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2020-08-25 11:23:25 +00:00
|
|
|
RunTrackMemoryIntervalTest(mm, 3, 3, 0);
|
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__track_memory, TestPrepend) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(2, 2)}},
|
|
|
|
{1, OPEN_MAX, 0, {I(1, 2)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2020-08-25 11:23:25 +00:00
|
|
|
RunTrackMemoryIntervalTest(mm, 1, 1, 0);
|
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__track_memory, TestFillHole) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{4, OPEN_MAX, 0, {I(1, 1), I(3, 4), {5, 5, 1, FRAMESIZE}, I(6, 8)}},
|
|
|
|
{3, OPEN_MAX, 0, {I(1, 4), {5, 5, 1, FRAMESIZE}, I(6, 8)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2020-08-25 11:23:25 +00:00
|
|
|
RunTrackMemoryIntervalTest(mm, 2, 2, 0);
|
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__track_memory, TestAppend2) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(2, 2)}},
|
|
|
|
{2, OPEN_MAX, 0, {I(2, 2), {3, 3, 1, FRAMESIZE}}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2020-08-25 11:23:25 +00:00
|
|
|
RunTrackMemoryIntervalTest(mm, 3, 3, 1);
|
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__track_memory, TestPrepend2) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(2, 2)}},
|
|
|
|
{2, OPEN_MAX, 0, {{1, 1, 1, FRAMESIZE}, I(2, 2)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2020-08-25 11:23:25 +00:00
|
|
|
RunTrackMemoryIntervalTest(mm, 1, 1, 1);
|
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__track_memory, TestFillHole2) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{4,
|
|
|
|
OPEN_MAX,
|
|
|
|
0,
|
|
|
|
{
|
|
|
|
I(1, 1),
|
|
|
|
I(3, 4),
|
|
|
|
{5, 5, 1, FRAMESIZE},
|
|
|
|
I(6, 8),
|
|
|
|
}},
|
|
|
|
{5,
|
|
|
|
OPEN_MAX,
|
|
|
|
0,
|
|
|
|
{
|
|
|
|
I(1, 1),
|
|
|
|
{2, 2, 1, FRAMESIZE},
|
|
|
|
{3, 4, 0, FRAMESIZE * 2},
|
|
|
|
{5, 5, 1, FRAMESIZE},
|
|
|
|
{6, 8, 0, FRAMESIZE * 3},
|
|
|
|
}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2020-08-25 11:23:25 +00:00
|
|
|
RunTrackMemoryIntervalTest(mm, 2, 2, 1);
|
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__find_memory, Test) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[1] = {
|
2020-11-13 09:27:49 +00:00
|
|
|
{
|
|
|
|
4,
|
2021-09-04 20:20:47 +00:00
|
|
|
OPEN_MAX,
|
|
|
|
0,
|
2020-11-13 09:27:49 +00:00
|
|
|
{
|
|
|
|
[0] = {1, 1},
|
|
|
|
[1] = {3, 4},
|
|
|
|
[2] = {5, 5, 1},
|
|
|
|
[3] = {6, 8},
|
|
|
|
},
|
|
|
|
},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
2023-08-14 03:31:27 +00:00
|
|
|
EXPECT_EQ(0, __find_memory(mm, 0));
|
|
|
|
EXPECT_EQ(0, __find_memory(mm, 1));
|
|
|
|
EXPECT_EQ(1, __find_memory(mm, 2));
|
|
|
|
EXPECT_EQ(1, __find_memory(mm, 3));
|
|
|
|
EXPECT_EQ(1, __find_memory(mm, 4));
|
|
|
|
EXPECT_EQ(2, __find_memory(mm, 5));
|
|
|
|
EXPECT_EQ(3, __find_memory(mm, 6));
|
|
|
|
EXPECT_EQ(3, __find_memory(mm, 7));
|
|
|
|
EXPECT_EQ(3, __find_memory(mm, 8));
|
|
|
|
EXPECT_EQ(4, __find_memory(mm, 9));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestEmpty) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
|
|
|
{0, OPEN_MAX, 0, {}},
|
|
|
|
{0, OPEN_MAX, 0, {}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 2, 2));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestRemoveElement_UsesInclusiveRange) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{3, OPEN_MAX, 0, {I(0, 0), I(2, 2), I(4, 4)}},
|
|
|
|
{2, OPEN_MAX, 0, {I(0, 0), I(4, 4)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 2, 2));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestPunchHole) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(0, 9)}},
|
|
|
|
{2, OPEN_MAX, 0, {I(0, 3), I(6, 9)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 4, 5));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestShortenLeft) {
|
2021-01-25 21:08:05 +00:00
|
|
|
if (IsWindows()) return;
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(0, 9)}},
|
|
|
|
{1, OPEN_MAX, 0, {I(0, 7)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 8, 9));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestShortenRight) {
|
2021-01-25 21:08:05 +00:00
|
|
|
if (IsWindows()) return;
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(0, 9)}},
|
|
|
|
{1, OPEN_MAX, 0, {I(3, 9)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 0, 2));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestShortenLeft2) {
|
2021-01-25 21:08:05 +00:00
|
|
|
if (IsWindows()) return;
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(0, 9)}},
|
|
|
|
{1, OPEN_MAX, 0, {I(0, 7)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 8, 11));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestShortenRight2) {
|
2021-01-25 21:08:05 +00:00
|
|
|
if (IsWindows()) return;
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(0, 9)}},
|
|
|
|
{1, OPEN_MAX, 0, {I(3, 9)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, -3, 2));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestZeroZero) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(3, 9)}},
|
|
|
|
{1, OPEN_MAX, 0, {I(3, 9)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 0, 0));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestNoopLeft) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(3, 9)}},
|
|
|
|
{1, OPEN_MAX, 0, {I(3, 9)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 1, 2));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestNoopRight) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{1, OPEN_MAX, 0, {I(3, 9)}},
|
|
|
|
{1, OPEN_MAX, 0, {I(3, 9)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 10, 10));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestBigFree) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{2, OPEN_MAX, 0, {I(0, 3), I(6, 9)}},
|
2021-09-04 20:20:47 +00:00
|
|
|
{0, OPEN_MAX, 0, {}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, INT_MIN, INT_MAX));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|
|
|
|
|
2023-08-14 03:31:27 +00:00
|
|
|
TEST(__untrack_memory, TestWeirdGap) {
|
2021-09-04 20:20:47 +00:00
|
|
|
static struct MemoryIntervals mm[2] = {
|
2022-05-18 23:41:29 +00:00
|
|
|
{3, OPEN_MAX, 0, {I(10, 10), I(20, 20), I(30, 30)}},
|
|
|
|
{2, OPEN_MAX, 0, {I(10, 10), I(30, 30)}},
|
2020-08-25 11:23:25 +00:00
|
|
|
};
|
2021-09-04 20:20:47 +00:00
|
|
|
mm[0].p = mm[0].s;
|
|
|
|
mm[1].p = mm[1].s;
|
2021-01-25 21:08:05 +00:00
|
|
|
EXPECT_NE(-1, RunReleaseMemoryIntervalsTest(mm, 15, 25));
|
2020-08-25 11:23:25 +00:00
|
|
|
}
|