Corrected the cell search algorithm so that it allocates memory
for BPEnum instead of putting it in the local frame. The structure is half a megabyte and will severely limit the hierarchy depth because it is used in the recursive cell search.
This commit is contained in:
parent
65b54e0cd5
commit
bc46a7d469
|
|
@ -76,19 +76,23 @@ struct seeTypesArg
|
||||||
* Returns 1 if the func() returns 1; otherwise returns 0 to keep the
|
* Returns 1 if the func() returns 1; otherwise returns 0 to keep the
|
||||||
* search alive.
|
* search alive.
|
||||||
*
|
*
|
||||||
|
* NOTE: struct BPEnum has an array size 10000, causing this routine to
|
||||||
|
* take up a half megabyte of stack space if the variable is declared
|
||||||
|
* inside the local frame. Use mallocMagic() instead.
|
||||||
*-----------------------------------------------------------------------------
|
*-----------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
DBSrCellPlaneArea(BPlane *plane, Rect *rect, int (*func)(), ClientData arg)
|
DBSrCellPlaneArea(BPlane *plane, Rect *rect, int (*func)(), ClientData arg)
|
||||||
{
|
{
|
||||||
BPEnum bpe;
|
BPEnum *bpe;
|
||||||
CellUse *use;
|
CellUse *use;
|
||||||
int rval = 0;
|
int rval = 0;
|
||||||
|
|
||||||
BPEnumInit(&bpe, plane, rect, BPE_OVERLAP, "DBSrCellPlaneArea");
|
bpe = (BPEnum *)mallocMagic(sizeof(BPEnum));
|
||||||
|
BPEnumInit(bpe, plane, rect, BPE_OVERLAP, "DBSrCellPlaneArea");
|
||||||
|
|
||||||
while (use = BPEnumNext(&bpe))
|
while (use = BPEnumNext(bpe))
|
||||||
{
|
{
|
||||||
if ((*func)(use, arg))
|
if ((*func)(use, arg))
|
||||||
{
|
{
|
||||||
|
|
@ -97,7 +101,8 @@ DBSrCellPlaneArea(BPlane *plane, Rect *rect, int (*func)(), ClientData arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BPEnumTerm(&bpe);
|
BPEnumTerm(bpe);
|
||||||
|
freeMagic(bpe);
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue