Update of /cvsroot/monetdb/MonetDB5/src/mal
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv11377/mal
Modified Files:
mal_recycle.mx
Log Message:
make sure we free up, when we run out of memory
Index: mal_recycle.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB5/src/mal/mal_recycle.mx,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- mal_recycle.mx 12 Mar 2008 19:31:45 -0000 1.40
+++ mal_recycle.mx 12 Mar 2008 21:15:06 -0000 1.41
@@ -64,7 +64,7 @@
#include "mal_instruction.h"
/* #define _DEBUG_RECYCLE_ trace behavior */
-//#define _DEBUG_RECYCLE_REUSE
+#define _DEBUG_RECYCLE_REUSE
@-
We need some hard limits to not run out of datastructure
spaces.
@@ -78,11 +78,11 @@
mal_export int recycleVersion; /* version of recycle table */
mal_export int retainPolicy;
-#define RETAIN_NONE 0
-#define RETAIN_ALL 1
-#define RETAIN_TIME 2
-#define RETAIN_SIZE 3
-#define RETAIN_VOL 4
+#define RETAIN_NONE 0
+#define RETAIN_ALL 1
+#define RETAIN_TIME 2
+#define RETAIN_SIZE 3
+#define RETAIN_VOL 4
#define RETAIN_ADAPT 5
mal_export int recycleTime;
@@ -242,15 +242,17 @@
the performance record.
@c
static void
-RECYCLEcache(int k)
+RECYCLEcache(int k, int wr)
{
int i, max;
InstrPtr pc;
- int mem = recyclerUsedMemory > recycleMemory;
+ int mem = (recycleMemory && recyclerUsedMemory + wr > recycleMemory);
+ int size = (recycleCacheLimit && recycleBlk->stop + (k>0) >
recycleCacheLimit);
if (recycleBlk) {
- recycleBlk->profiler[k].clk= 1; /* most recently used */
- max= 0;
+ if (k>=0)
+ recycleBlk->profiler[k].clk= 1; /* most recently used */
+ max = 0;
for(i=0; i< recycleBlk->stop; i++){
recycleBlk->profiler[i].clk++;
switch(rcachePolicy){
@@ -273,7 +275,7 @@
max = i;
}
}
- if( recycleBlk->stop > recycleCacheLimit && recycleClaim <= 1){
+ if (mem || (size && recycleClaim <= 1)){
#ifdef _DEBUG_RECYCLE_
stream_printf(GDKout,"RECYCLE cache, remove %d \n",max);
#endif
@@ -283,8 +285,10 @@
if( isaBatType(getVarType(recycleBlk,
getArg(pc,i))) )
BBPdecref(getVarConstant(recycleBlk,i).val.bval,TRUE);
recyclerUsedMemory -= recycleBlk->profiler[max].obytes;
+ for(i=max; i < recycleBlk->stop-1; i++)
+ recycleBlk->profiler[i] =
recycleBlk->profiler[i+1];
removeInstruction(recycleBlk,getInstrPtr(recycleBlk,max));
- trimMalVariables(recycleBlk);
+ //trimMalVariables(recycleBlk);
if (monitorRecycler)
fprintf(stderr, "memory=%lld, stop=%d,
recycled=%d(%d), saved=%d\n",
recyclerUsedMemory, recycleBlk->stop,
@@ -292,7 +296,6 @@
recycleVersion++;
mal_unset_lock(recycleLock,"recycle");
}
- /* TODO when we evict one we should evict all depending on it,
etc */
}
}
@@ -542,8 +545,8 @@
if (cnt != p->retc && (i = RECYCLEreuse(mb,stk,p)) >= 0 )
cnt = p->retc;
stk->clk= GDKusec();
- if (recycleCacheLimit && i>=0)
- RECYCLEcache(i);
+ if ((recycleCacheLimit || recycleMemory) && i>=0)
+ RECYCLEcache(i, 0);
statements++;
recycled += cnt==p->retc;
return cnt == p->retc;
@@ -568,7 +571,9 @@
#endif
clk= GDKusec()-stk->clk;
- switch(retainPolicy){
+ while ((recycleMemory && recyclerUsedMemory + wr > recycleMemory))
+ RECYCLEcache(-1, wr);
+ switch(retainPolicy) {
case RETAIN_NONE:
/* RETAIN_NONE: baseline, keeps stat, no retain, no reuse */
break;
@@ -578,13 +583,13 @@
(void) RECYCLEnew(mb, stk, p, rd, wr);
break;
case RETAIN_TIME:
- /* 2: time-based semantics, retain if beneficial */
+ /* RETAIN_TIME: time-based semantics, retain if beneficial */
if (clk > ABS(recycleTime) && !RECYCLEfind(mb,stk,p))
(void) RECYCLEnew(mb, stk, p, rd, wr);
break;
case RETAIN_SIZE:
{
- /* 3: size cost model */
+ /* RETAIN_SIZE: size cost model */
if (recycleVolume && !RECYCLEfind(mb,stk,p)){
if (rd+wr > recycleVolume){
(void) RECYCLEnew(mb, stk, p, rd, wr);
@@ -596,7 +601,7 @@
}
case RETAIN_VOL:
{
- /* 4: volumetric cost model (time x size )*/
+ /* RETAIN_VOL: volumetric cost model (time x size )*/
if (recycleVolume && !RECYCLEfind(mb,stk,p)){
if (recycleAlpha *(rd+wr) + (1-recycleAlpha)* clk >
recycleVolume * recycleTime){
(void) RECYCLEnew(mb, stk, p, rd, wr);
@@ -607,7 +612,7 @@
}
}
case RETAIN_ADAPT:
- /* 5: adaptive temporal */
+ /* RETAIN_ADAPT: adaptive temporal */
if (clk > recycleTime && !RECYCLEfind(mb,stk,p))
(void) RECYCLEnew(mb, stk, p, rd, wr);
/* adapt the time watermark based on observed behavior */
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-checkins