Changeset: cc18a1332a5f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cc18a1332a5f
Modified Files:
monetdb5/optimizer/opt_pipes.c
Branch: Jul2012
Log Message:
opt_pipes: make adding pipes more reliable
- don't rely on a magic number (to GDKfree stack allocated memory)
- improved list logic a bit
diffs (195 lines):
diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -47,6 +47,7 @@ struct PIPELINES {
char *status;
char *prerequisite;
MalBlkPtr mb;
+ char builtin;
} pipes[MAXOPTPIPES] = {
/* The minimal pipeline necessary by the server to operate correctly*/
{"minimal_pipe",
@@ -55,7 +56,7 @@ struct PIPELINES {
"optimizer.deadcode();"
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "stable", 0, 0},
+ "stable", NULL, NULL, 1},
/* The default pipe line contains as of Feb2010
* mitosis-mergetable-reorder, aimed at large tables and improved
* access locality
@@ -82,7 +83,7 @@ struct PIPELINES {
"optimizer.multiplex();"
"optimizer.accumulators();"
"optimizer.garbageCollector();",
- "stable", 0, 0},
+ "stable", NULL, NULL, 1},
{"groups_pipe",
"optimizer.inline();"
"optimizer.remap();"
@@ -105,7 +106,7 @@ struct PIPELINES {
"optimizer.multiplex();"
"optimizer.accumulators();"
"optimizer.garbageCollector();",
- "stable", 0, 0},
+ "stable", NULL, NULL, 1},
/* The no_mitosis pipe line is (and should be kept!) identical to the
* default pipeline, except that optimizer mitosis is omitted. It is
* used mainly to make some tests work deterministically, and to check
@@ -133,7 +134,7 @@ struct PIPELINES {
"optimizer.multiplex();"
"optimizer.accumulators();"
"optimizer.garbageCollector();",
- "stable", 0, 0},
+ "stable", NULL, NULL, 1},
/* The sequential pipe line is (and should be kept!) identical to the
* default pipeline, except that optimizers mitosis & dataflow are
* omitted. It is use mainly to make some tests work
@@ -160,7 +161,7 @@ struct PIPELINES {
"optimizer.multiplex();"
"optimizer.accumulators();"
"optimizer.garbageCollector();",
- "stable", 0, 0},
+ "stable", NULL, NULL, 1},
/* The default pipeline used in the November 2009 release
{"nov2009_pipe",
"optimizer.inline();"
@@ -182,7 +183,7 @@ struct PIPELINES {
"optimizer.history();"
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "stable", 0, 0},
+ "stable", NULL, NULL, 1},
*/
/* Experimental pipelines stressing various components under
* development. Do not use any of these pipelines in production
@@ -210,7 +211,7 @@ struct PIPELINES {
"optimizer.replication();"
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "experimental", 0, 0},
+ "experimental", NULL, NULL, 1},
*/
{"accumulator_pipe",
"optimizer.inline();"
@@ -233,7 +234,7 @@ struct PIPELINES {
"optimizer.multiplex();"
"optimizer.accumulators();"
"optimizer.garbageCollector();",
- "stable", 0, 0},
+ "stable", NULL, NULL, 1},
{"recycler_pipe",
"optimizer.inline();"
"optimizer.remap();"
@@ -252,7 +253,7 @@ struct PIPELINES {
"optimizer.history();"
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "experimental", 0, 0},
+ "experimental", NULL, NULL, 1},
{"cracker_pipe",
"optimizer.inline();"
"optimizer.remap();"
@@ -273,7 +274,7 @@ struct PIPELINES {
"optimizer.history();"
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "experimental", "OPTselcrack", 0},
+ "experimental", "OPTselcrack", NULL, 1},
{"sidcrack_pipe",
"optimizer.inline();"
"optimizer.remap();"
@@ -294,7 +295,7 @@ struct PIPELINES {
"optimizer.history();"
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "experimental", "OPTsidcrack", 0},
+ "experimental", "OPTsidcrack", NULL, 1},
/*
* The Octopus pipeline for distributed processing (Merovingian enabled
platforms only)
*/
@@ -322,7 +323,7 @@ struct PIPELINES {
"optimizer.history();"
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "experimental", "OPToctopus", 0},
+ "experimental", "OPToctopus", NULL, 1},
/*
* The centipede pipe line aims at a map-reduce style of query processing
*/
@@ -349,7 +350,7 @@ struct PIPELINES {
"optimizer.multiplex();"
"optimizer.accumulators();"
"optimizer.garbageCollector();",
- "experimental", "OPTcentipede", 0},
+ "experimental", "OPTcentipede", NULL, 1},
#endif
/* The default + datacyclotron*/
{"datacyclotron_pipe",
@@ -374,7 +375,7 @@ struct PIPELINES {
/* "optimizer.replication();" not used */
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "experimental", "OPTdatacyclotron", 0},
+ "experimental", "OPTdatacyclotron", NULL, 1},
/* The default + dictionary*/
{"dictionary_pipe",
"optimizer.inline();"
@@ -397,7 +398,7 @@ struct PIPELINES {
"optimizer.history();"
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "experimental", "OPTdictionary", 0},
+ "experimental", "OPTdictionary", NULL, 1},
/* The default + compression */
{"compression_pipe",
"optimizer.inline();"
@@ -421,16 +422,12 @@ struct PIPELINES {
"optimizer.history();"
"optimizer.multiplex();"
"optimizer.garbageCollector();",
- "experimental", "OPTcompress", 0},
+ "experimental", "OPTcompress", NULL, 1},
+/* sentinel */
+ {NULL, NULL, NULL, NULL, NULL, 0}
};
-#ifdef WIN32
-static int builtinoptimizers = 8;
-#else
-static int builtinoptimizers = 11;
-#endif
/*
- * @-
* Debugging the optimizer pipeline",
* The best way is to use mdb and inspect the information gathered",
* during the optimization phase. Several optimizers produce more",
@@ -451,13 +448,13 @@ addPipeDefinition(Client cntxt, str name
struct PIPELINES oldpipe;
for (i = 0; i < MAXOPTPIPES && pipes[i].name; i++)
- if (pipes[i].name && strcmp(name, pipes[i].name) == 0)
+ if (strcmp(name, pipes[i].name) == 0)
break;
- if (i < builtinoptimizers)
- throw(MAL, "optimizer.addPipeDefinition", "No overwrite of
built in allowed");
if (i == MAXOPTPIPES)
throw(MAL, "optimizer.addPipeDefinition", "Out of slots");
+ if (pipes[i].name && pipes[i].builtin)
+ throw(MAL, "optimizer.addPipeDefinition", "No overwrite of
built in allowed");
/* save old value */
oldpipe = pipes[i];
@@ -484,6 +481,11 @@ addPipeDefinition(Client cntxt, str name
freeMalBlk(oldpipe.mb);
if (oldpipe.status)
GDKfree(oldpipe.status);
+ if (++i < MAXOPTPIPES) {
+ pipes[i].name = pipes[i].def = pipes[i].status =
pipes[i].prerequisite = NULL;
+ pipes[i].mb = NULL;
+ pipes[i].builtin = 0;
+ }
}
return msg;
}
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list