From faabb764d5b5a83d4b00dda347a6bab485e18582 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@dune-project.org> Date: Sun, 16 Dec 2012 08:00:47 +0000 Subject: [PATCH] Do not allocate arrays of size WOP_DOWN_CHANNELS_MAX on the stack. Allocate them on the heap instead. I want't to make the _MAX value much larger, to accommodate for higher processors numbers. Allocating arrays of that size on the stack would possibly make the stack overflow. [[Imported from SVN: r8459]] --- graphics/uggraph/wop.c | 57 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/graphics/uggraph/wop.c b/graphics/uggraph/wop.c index 2dc3b495e..61426560c 100644 --- a/graphics/uggraph/wop.c +++ b/graphics/uggraph/wop.c @@ -17796,12 +17796,17 @@ static INT CollectCoarseGrid(MULTIGRID *mg, INT MarkKeyMaster) INT MarkBottomKey; /* state information */ - INT receiving[WOP_DOWN_CHANNELS_MAX], sending[WOP_DOWN_CHANNELS_MAX+1], - nbTokens[WOP_DOWN_CHANNELS_MAX], more[WOP_DOWN_CHANNELS_MAX+1], - count[WOP_DOWN_CHANNELS_MAX+1], front[WOP_DOWN_CHANNELS_MAX+1], - rear[WOP_DOWN_CHANNELS_MAX+1]; - int serror[WOP_DOWN_CHANNELS_MAX+1], rerror[WOP_DOWN_CHANNELS_MAX]; - msgid outmsg[WOP_DOWN_CHANNELS_MAX+1], inmsg[WOP_DOWN_CHANNELS_MAX]; + INT* receiving = (INT*)malloc(WOP_DOWN_CHANNELS_MAX*sizeof(INT)); + INT* sending = (INT*)malloc((WOP_DOWN_CHANNELS_MAX+1)*sizeof(INT)); + INT* nbTokens = (INT*)malloc(WOP_DOWN_CHANNELS_MAX*sizeof(INT)); + INT* more = (INT*)malloc((WOP_DOWN_CHANNELS_MAX+1)*sizeof(INT)); + INT* count = (INT*)malloc((WOP_DOWN_CHANNELS_MAX+1)*sizeof(INT)); + INT* front = (INT*)malloc((WOP_DOWN_CHANNELS_MAX+1)*sizeof(INT)); + INT* rear = (INT*)malloc((WOP_DOWN_CHANNELS_MAX+1)*sizeof(INT)); + int* serror = (int*)malloc((WOP_DOWN_CHANNELS_MAX+1)*sizeof(int)); + int* rerror = (int*)malloc(WOP_DOWN_CHANNELS_MAX*sizeof(int)); + msgid* outmsg = (msgid*)malloc((WOP_DOWN_CHANNELS_MAX+1)*sizeof(msgid)); + msgid* inmsg = (msgid*)malloc(WOP_DOWN_CHANNELS_MAX*sizeof(msgid)); /* init */ elem = FIRSTELEMENT(GRID_ON_LEVEL(mg,0)); @@ -17825,6 +17830,17 @@ oops: if (error) { Release(heap,FROM_BOTTOM,MarkBottomKey); UserWrite("CollectCoarseGrid(): error in stage 0\n"); + free(receiving); + free(sending); + free(nbTokens); + free(more); + free(count); + free(front); + free(rear); + free(serror); + free(rerror); + free(outmsg); + free(inmsg); return 1; } for (i=0; i<WopDownChannels; i++) { @@ -18010,6 +18026,19 @@ oops: } } Release(heap,FROM_BOTTOM,MarkBottomKey); + + free(receiving); + free(sending); + free(nbTokens); + free(more); + free(count); + free(front); + free(rear); + free(serror); + free(rerror); + free(outmsg); + free(inmsg); + return error; } #endif @@ -21079,8 +21108,8 @@ static void ConnectWopTree(void) static void NumberOfDesc(void) { - msgid umid, dmid[WOP_DOWN_CHANNELS_MAX]; - int uerr, derr[WOP_DOWN_CHANNELS_MAX]; + msgid* umid, dmid; + int* uerr, derr; INT sum; INT i, noDesc; @@ -21090,6 +21119,12 @@ static void NumberOfDesc(void) noDesc = (noDesc && WOP_DownChannel[i] == NULL); } if (procs < 2) return; + + umid = (msgid*)malloc(WOP_DOWN_CHANNELS_MAX*sizeof(msgid)); + dmid = (msgid*)malloc(WOP_DOWN_CHANNELS_MAX*sizeof(msgid)); + uerr = (int*)malloc(WOP_DOWN_CHANNELS_MAX*sizeof(int)); + derr = (int*)malloc(WOP_DOWN_CHANNELS_MAX*sizeof(int)); + if (noDesc) { sum = 1; umid = SendASync(WOP_UpChannel, &sum, sizeof(sum), &uerr); @@ -21114,6 +21149,12 @@ static void NumberOfDesc(void) while (InfoASend(WOP_UpChannel, umid) != 1); } } + + /* Release heap memory */ + free umid; + free dmid; + free uerr; + free derr; } -- GitLab