qbsp: clean up brush memory leaks

This commit is contained in:
Eric Wasylishen 2017-07-23 13:06:08 -06:00
parent 7c49d499c2
commit b38c04b372
3 changed files with 37 additions and 12 deletions

View File

@ -53,4 +53,6 @@ vec_t BrushVolume (const brush_t *brush);
int BrushMostlyOnSide (const brush_t *brush, const vec3_t normal, vec_t dist);
void SplitBrush (const brush_t *brush, int planenum, int planeside, brush_t **front, brush_t **back);
void FreeBrush(brush_t *brush);
#endif

View File

@ -514,8 +514,7 @@ FreeBrushes(mapentity_t *ent)
for (brush = ent->brushes; brush; brush = next) {
next = brush->next;
FreeBrushFaces(brush->faces);
FreeMem(brush, BRUSH, 1);
FreeBrush(brush);
}
ent->brushes = nullptr;
}
@ -528,7 +527,7 @@ FreeBrush
void
FreeBrush(brush_t *brush)
{
Q_assert(brush->next == nullptr);
FreeBrushFaces(brush->faces);
FreeMem(brush, BRUSH, 1);
}
@ -1076,7 +1075,7 @@ Brush_LoadEntity(mapentity_t *dst, const mapentity_t *src, const int hullnum)
VectorCopy(origin, rotate_offset);
usesOriginBrush = true;
FreeMem(brush, BRUSH, 1);
FreeBrush(brush);
}
}
}
@ -1164,8 +1163,7 @@ Brush_LoadEntity(mapentity_t *dst, const mapentity_t *src, const int hullnum)
if (brush) {
AddToBounds(dst, brush->mins);
AddToBounds(dst, brush->maxs);
FreeBrushFaces(brush->faces);
FreeMem(brush, BRUSH, 1);
FreeBrush(brush);
}
continue;
}
@ -1572,6 +1570,11 @@ void SplitBrush (const brush_t *brush,
newface->next = b[j]->faces;
b[j]->faces = newface;
}
if (cw[0])
FreeMem(cw[0], WINDING, 1);
if (cw[1])
FreeMem(cw[1], WINDING, 1);
}
@ -1651,7 +1654,7 @@ void SplitBrush (const brush_t *brush,
v1 = BrushVolume (b[i]);
if (v1 < 1.0)
{
FreeMem (b[i], BRUSH, 1);
FreeBrush(b[i]);
b[i] = nullptr;
logprint ("tiny volume after clip\n");
}
@ -1660,5 +1663,7 @@ void SplitBrush (const brush_t *brush,
*front = b[0];
*back = b[1];
FreeMem(midwinding, WINDING, 1);
}

View File

@ -118,7 +118,7 @@ TEST(qbsp, duplicatePlanes) {
brush_t *brush = LoadBrush(&worldspawn.mapbrush(0), vec3_origin, 0);
ASSERT_NE(nullptr, brush);
EXPECT_EQ(6, Brush_NumFaces(brush));
FreeMem(brush, BRUSH, 1);
FreeBrush(brush);
}
static brush_t *load128x128x32Brush()
@ -163,7 +163,7 @@ TEST(qbsp, BrushMostlyOnSide1) {
EXPECT_EQ(SIDE_FRONT, BrushMostlyOnSide(brush, plane1normal, plane1dist));
FreeMem(brush, BRUSH, 1);
FreeBrush(brush);
}
TEST(qbsp, BrushMostlyOnSide2) {
@ -174,7 +174,7 @@ TEST(qbsp, BrushMostlyOnSide2) {
EXPECT_EQ(SIDE_BACK, BrushMostlyOnSide(brush, plane1normal, plane1dist));
FreeMem(brush, BRUSH, 1);
FreeBrush(brush);
}
TEST(qbsp, BoundBrush) {
@ -192,7 +192,7 @@ TEST(qbsp, BoundBrush) {
EXPECT_FLOAT_EQ(64, brush->maxs[1]);
EXPECT_FLOAT_EQ(16, brush->maxs[2]);
FreeMem(brush, BRUSH, 1);
FreeBrush(brush);
}
static void checkForAllCubeNormals(const brush_t *brush)
@ -268,7 +268,7 @@ TEST(qbsp, SplitBrush) {
checkCube(back);
FreeMem(brush, BRUSH, 1);
FreeBrush(brush);
FreeMem(front, BRUSH, 1);
FreeMem(back, BRUSH, 1);
}
@ -289,6 +289,24 @@ TEST(qbsp, SplitBrushOnSide) {
EXPECT_EQ(nullptr, back);
}
#if 0
TEST(qbsp, MemLeaks) {
brush_t *brush = load128x128x32Brush();
const vec3_t planenormal = { -1, 0, 0 };
int planeside;
const int planenum = FindPlane(planenormal, 0.0, &planeside);
for (int i=0; i<1000000; i++) {
brush_t *front, *back;
SplitBrush(brush, planenum, planeside, &front, &back);
FreeBrush(front);
FreeBrush(back);
}
}
#endif
TEST(mathlib, WindingArea) {
winding_t w;
w.numpoints = 5;