Changeset: 4cf411d38ca6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4cf411d38ca6
Modified Files:
        gdk/gdk_batop.c
        gdk/gdk_posix.c
        gdk/gdk_utils.c
        monetdb5/extras/jaql/jaqlscenario.c
        monetdb5/mal/mal.c
        monetdb5/mal/mal.h
        monetdb5/mal/mal_client.c
        monetdb5/mal/mal_client.h
        monetdb5/mal/mal_dataflow.c
        monetdb5/mal/mal_debugger.c
        monetdb5/mal/mal_interpreter.c
        monetdb5/mal/mal_recycle.c
        monetdb5/mal/mal_scenario.c
        monetdb5/mal/mal_session.c
        monetdb5/modules/kernel/status.c
        monetdb5/modules/mal/clients.c
        monetdb5/modules/mal/clients.mal
        monetdb5/modules/mal/mdb.c
        sql/backends/monet5/sql_scenario.c
Branch: default
Log Message:

Merge with Feb2013 branch.


diffs (truncated from 806 to 300 lines):

diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1315,8 +1315,14 @@ BATsubsort(BAT **sorted, BAT **order, BA
                /* no place to put result, so we're done quickly */
                return GDK_SUCCEED;
        }
-       if (BATcount(b) <= 1 || (BATtordered(b) && o == NULL && g == NULL && 
groups == NULL)) {
-               /* trivially (sub)sorted */
+       if (BATcount(b) <= 1 ||
+           ((reverse ? BATtrevordered(b) : BATtordered(b)) &&
+            o == NULL && g == NULL &&
+            (groups == NULL || BATtkey(b) ||
+             (reverse ? BATtordered(b) : BATtrevordered(b))))) {
+               /* trivially (sub)sorted, and either we don't need to
+                * return group information, or we can trivially
+                * deduce the groups */
                if (sorted) {
                        BBPfix(b->batCacheid);
                        bn = b;
@@ -1332,12 +1338,23 @@ BATsubsort(BAT **sorted, BAT **order, BA
                        *order = on;
                }
                if (groups) {
-                       gn = BATnew(TYPE_void, TYPE_void, BATcount(b));
-                       if (gn == NULL)
-                               goto error;
-                       BATsetcount(gn, BATcount(b));
+                       if (BATtkey(b)) {
+                               /* singleton groups */
+                               gn = BATnew(TYPE_void, TYPE_void, BATcount(b));
+                               if (gn == NULL)
+                                       goto error;
+                               BATsetcount(gn, BATcount(b));
+                               BATseqbase(BATmirror(gn), 0);
+                       } else {
+                               /* single group */
+                               const oid *o = 0;
+                               assert(BATcount(b) == 1 ||
+                                      (BATtordered(b) && BATtrevordered(b)));
+                               gn = BATconstant(TYPE_oid, &o, BATcount(b));
+                               if (gn == NULL)
+                                       goto error;
+                       }
                        BATseqbase(gn, 0);
-                       BATseqbase(BATmirror(gn), 0);
                        *groups = gn;
                }
                return GDK_SUCCEED;
@@ -1380,6 +1397,7 @@ BATsubsort(BAT **sorted, BAT **order, BA
                }
                BATseqbase(on, 0);
                on->tsorted = on->trevsorted = 0;
+               on->tdense = 0;
                *order = on;
        }
        if (g) {
@@ -1434,7 +1452,7 @@ BATsubsort(BAT **sorted, BAT **order, BA
                } else if (b->U->count <= 1) {
                        b->tsorted = b->trevsorted = 1;
                }
-               if ((!(reverse && bn->trevsorted) && !(!reverse && 
bn->tsorted)) &&
+               if (!(reverse ? bn->trevsorted : bn->tsorted) &&
                    do_sort(Tloc(bn, BUNfirst(bn)),
                            on ? Tloc(on, BUNfirst(on)) : NULL,
                            bn->T->vheap ? bn->T->vheap->base : NULL,
diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c
--- a/gdk/gdk_posix.c
+++ b/gdk/gdk_posix.c
@@ -34,10 +34,6 @@
 #include <unistd.h>            /* sbrk on Solaris */
 #include <string.h>     /* strncpy */
 
-#ifdef __hpux
-extern char *sbrk(int);
-#endif
-
 #ifdef HAVE_FCNTL_H
 # include <fcntl.h>
 #endif
@@ -277,7 +273,7 @@ char *MT_heapbase = NULL;
 void
 MT_init_posix(void)
 {
-       MT_heapbase = (char *) sbrk(0);
+       MT_heapbase = 0;
 }
 
 /* return RSS in bytes */
@@ -362,7 +358,7 @@ MT_getrss(void)
 char *
 MT_heapcur(void)
 {
-       return (char *) sbrk(0);
+       return 0;
 }
 
 void *
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -433,10 +433,7 @@ MT_init(void)
 size_t
 GDKmem_cursize(void)
 {
-       /* RAM/swapmem that Monet has claimed from OS */
-       size_t heapsize = MT_heapcur() - MT_heapbase;
-
-       return (size_t) SEG_SIZE(heapsize, MT_VMUNITLOG);
+       return GDKmem_inuse();
 }
 
 size_t
@@ -639,15 +636,18 @@ GDKmemfail(str s, size_t len)
 
 /* allocate 8 bytes extra (so it stays 8-bytes aligned) and put
  * realsize in front */
-#define GDKmalloc_prefixsize(s,size)                                   \
-       do {                                                            \
-               s = (ssize_t *) malloc(size + MALLOC_EXTRA_SPACE + GLIBC_BUG); \
-               if (s != NULL) {                                        \
-                       assert((((size_t) s)&7) == 0); /* no MISALIGN */ \
-                       s = (ssize_t*) ((char*) s + MALLOC_EXTRA_SPACE); \
-                       s[-1] = (ssize_t) (size + MALLOC_EXTRA_SPACE);  \
-               }                                                       \
-       } while (0)
+static inline void *
+GDKmalloc_prefixsize(size_t size)
+{
+       ssize_t *s;
+
+       if ((s = malloc(size + MALLOC_EXTRA_SPACE + GLIBC_BUG)) != NULL) {
+               assert((((size_t) s) & 7) == 0); /* no MISALIGN */
+               s = (ssize_t*) ((char*) s + MALLOC_EXTRA_SPACE);
+               s[-1] = (ssize_t) (size + MALLOC_EXTRA_SPACE);
+       }
+       return s;
+}
 
 /*
  * The emergency flag can be set to force a fatal error if needed.
@@ -657,7 +657,7 @@ GDKmemfail(str s, size_t len)
 void *
 GDKmallocmax(size_t size, size_t *maxsize, int emergency)
 {
-       ssize_t *s = NULL;
+       void *s;
 
        if (size == 0) {
 #ifdef GDK_MEM_NULLALLOWED
@@ -667,10 +667,10 @@ GDKmallocmax(size_t size, size_t *maxsiz
 #endif
        }
        size = (size + 7) & ~7; /* round up to a multiple of eight */
-       GDKmalloc_prefixsize(s, size);
+       s = GDKmalloc_prefixsize(size);
        if (s == NULL) {
                GDKmemfail("GDKmalloc", size);
-               GDKmalloc_prefixsize(s, size);
+               s = GDKmalloc_prefixsize(size);
                if (s == NULL) {
                        if (emergency == 0) {
                                GDKerror("GDKmallocmax: failed for " SZFMT " 
bytes", size);
@@ -683,7 +683,7 @@ GDKmallocmax(size_t size, size_t *maxsiz
        }
        *maxsize = size;
        heapinc(size + MALLOC_EXTRA_SPACE);
-       return (void *) s;
+       return s;
 }
 
 #undef GDKmalloc
diff --git a/monetdb5/extras/jaql/jaqlscenario.c 
b/monetdb5/extras/jaql/jaqlscenario.c
--- a/monetdb5/extras/jaql/jaqlscenario.c
+++ b/monetdb5/extras/jaql/jaqlscenario.c
@@ -155,7 +155,7 @@ JAQLreader(Client c)
        /* "activate" the stream by sending a prompt (client sync) */
        if (c->fdin->eof != 0) {
                if (mnstr_flush(c->fdout) < 0) {
-                       c->mode = FINISHING;
+                       c->mode = FINISHCLIENT;
                } else {
                        c->fdin->eof = 0;
                }
@@ -180,7 +180,7 @@ JAQLparser(Client c)
                fprintf(stderr, "%s, cannot handle client!\n", errmsg);
                /* stop here, instead of printing the exception below to the
                 * client in an endless loop */
-               c->mode = FINISHING;
+               c->mode = FINISHCLIENT;
                return errmsg;
        }
 
@@ -204,7 +204,7 @@ JAQLparser(Client c)
 
        /* stop if it seems nothing is going to come any more */
        if (j->scanstreameof == 1) {
-               c->mode = FINISHING;
+               c->mode = FINISHCLIENT;
                freetree(j->p);
                j->p = NULL;
                return MAL_SUCCEED;
diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c
--- a/monetdb5/mal/mal.c
+++ b/monetdb5/mal/mal.c
@@ -18,9 +18,6 @@
  */
 
 /*
- * @f mal
- * @-
- * @node  Design Considerations, Architecture Overview, Design Overview, 
Design Overview
  * @+ Design Considerations
  * Redesign of the MonetDB software stack was driven by the need to
  * reduce the effort to extend the system into novel directions
@@ -73,7 +70,7 @@
  * Moreover, a textual interface reduces the programming
  * effort otherwise needed to develop test and application programs.
  * The XML trend as the language for tool interaction supports our decision.
- * @-
+ * 
  * @node Architecture Overview, MAL Synopsis, Design Considerations, Design  
Overview
  * @+ Architecture Overview
  * The architecture is built around a few independent components:
@@ -294,60 +291,79 @@ int mal_init(void){
        return 0;
 }
 /*
- * @-
  * Upon exit we should attempt to remove all allocated memory explicitly.
  * This seemingly superflous action is necessary to simplify analyis of
  * memory leakage problems later on.
  */
+
+/* stopping clients should be done with care, as they may be in the mids of
+ * transactions. One safe place is between MAL instructions, which would
+ * abort the transaction by raising an exception. All non-console sessions are
+ * terminate this way.
+ * We should also ensure that no new client enters the scene while shutting 
down.
+ * For this we mark the client records as BLOCKCLIENT.
+ *
+ * Beware, mal_exit is also called during a SIGTERM from the monetdb tool
+ */
+static void stopClients(void)
+{
+       Client cntxt = mal_clients;
+
+       MT_lock_set(&mal_contextLock,"stopClients");
+       for(cntxt= mal_clients +1;  cntxt < mal_clients+MAL_MAXCLIENTS; cntxt++)
+       if ( cntxt->mode == RUNCLIENT)
+               cntxt->mode = FINISHCLIENT; 
+       else if (cntxt->mode == FREECLIENT)
+               cntxt->mode = BLOCKCLIENT;
+       MT_lock_unset(&mal_contextLock,"stopClients");
+}
+
 int
 moreClients(int reruns)
 {
-       int freeclient=0, finishing=0, claimed=0;
+       int freeclient=0, finishing=0, running=0, blocked = 0;
        Client cntxt = mal_clients;
 
-       freeclient=0; finishing=0; claimed=0;
        for(cntxt= mal_clients+1;  cntxt<mal_clients+MAL_MAXCLIENTS; cntxt++){
                freeclient += (cntxt->mode == FREECLIENT);
-               finishing += (cntxt->mode == FINISHING);
-               claimed += (cntxt->mode == CLAIMED);
-               if( cntxt->mode & FINISHING)
-                       printf("#Client %d %d\n",(int)(cntxt - mal_clients), 
cntxt->idx);
+               finishing += (cntxt->mode == FINISHCLIENT);
+               running += (cntxt->mode == RUNCLIENT);
+               blocked += (cntxt->mode == BLOCKCLIENT);
        }
-       if( reruns == 3){
-               mnstr_printf(mal_clients->fdout,"#MALexit: server forced exit"
-                       " %d finishing %d claimed\n",
-                               finishing,claimed);
+       if( reruns > 3){
+               printf("MALexit: server forced exit %d free %d finishing %d 
running %d blocked\n",
+                               freeclient, finishing,running, blocked);
                return 0;
        }
-       return finishing+claimed;
+       return finishing+running;
 }
+
 void mal_exit(void){
        str err;
 
        /*
-        * @-
         * Before continuing we should make sure that all clients
         * (except the console) have left the scene.
         */
-       RECYCLEdrop(mal_clients); /* remove any left over intermediates */
-       stopProfiling();
+       stopClients();
+#if 0
+{
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to