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

Reply via email to