Changeset: 1962d2627ee0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1962d2627ee0
Modified Files:
        gdk/gdk_group.c
        tools/merovingian/daemon/client.c
Branch: default
Log Message:

Merge with Oct2014 branch.


diffs (235 lines):

diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -551,6 +551,27 @@ BATgroup_internal(BAT **groups, BAT **ex
        /* figure out if we can use the storage type also for
         * comparing values */
        t = ATOMbasetype(b->ttype);
+       /* for strings we can use the offset instead of the actual
+        * string values if we know that the strings in the string
+        * heap are unique */
+       if (t == TYPE_str && GDK_ELIMDOUBLES(b->T->vheap)) {
+               switch (b->T->width) {
+               case 1:
+                       t = TYPE_bte;
+                       break;
+               case 2:
+                       t = TYPE_sht;
+                       break;
+#if SIZEOF_VAR_T == 8
+               case 4:
+                       t = TYPE_int;
+                       break;
+#endif
+               default:
+                       t = TYPE_var;
+                       break;
+               }
+       }
 
        if (((b->tsorted || b->trevsorted) &&
             (g == NULL || g->tsorted || g->trevsorted)) ||
@@ -682,7 +703,7 @@ BATgroup_internal(BAT **groups, BAT **ex
                }
 
                GDKfree(pgrp);
-       } else if (g == NULL && ATOMbasetype(b->ttype) == TYPE_bte) {
+       } else if (g == NULL && t == TYPE_bte) {
                /* byte-sized values, use 256 entry array to keep
                 * track of doled out group ids; note that we can't
                 * possibly have more than 256 groups, so the group id
@@ -708,7 +729,7 @@ BATgroup_internal(BAT **groups, BAT **ex
                                cnts[v]++;
                }
                GDKfree(bgrps);
-       } else if (g == NULL && ATOMbasetype(b->ttype) == TYPE_sht) {
+       } else if (g == NULL && t == TYPE_sht) {
                /* short-sized values, use 65536 entry array to keep
                 * track of doled out group ids; note that we can't
                 * possibly have more than 65536 groups, so the group
diff --git a/tools/merovingian/daemon/client.c 
b/tools/merovingian/daemon/client.c
--- a/tools/merovingian/daemon/client.c
+++ b/tools/merovingian/daemon/client.c
@@ -34,9 +34,15 @@
 #include "controlrunner.h"
 #include "client.h"
 
+struct threads {
+       struct threads *next;
+       pthread_t tid;
+       volatile char dead;
+};
 struct clientdata {
        int sock;
        int isusock;
+       struct threads *self;
 };
 
 static void *
@@ -62,18 +68,23 @@ handleClient(void *data)
        char *algos;
        int sock;
        char isusock;
+       struct threads *self;
 
        sock = ((struct clientdata *) data)->sock;
        isusock = ((struct clientdata *) data)->isusock;
+       self = ((struct clientdata *) data)->self;
        free(data);
        fdin = socket_rastream(sock, "merovingian<-client (read)");
-       if (fdin == 0)
+       if (fdin == 0) {
+               self->dead = 1;
                return(newErr("merovingian-client inputstream problems"));
+       }
        fdin = block_stream(fdin);
 
        fout = socket_wastream(sock, "merovingian->client (write)");
        if (fout == 0) {
                close_stream(fdin);
+               self->dead = 1;
                return(newErr("merovingian-client outputstream problems"));
        }
        fout = block_stream(fout);
@@ -128,6 +139,7 @@ handleClient(void *data)
                close_stream(fout);
                close_stream(fdin);
                free(algos);
+               self->dead = 1;
                return(e);
        }
        buf[sizeof(buf) - 1] = '\0';
@@ -149,6 +161,7 @@ handleClient(void *data)
                close_stream(fout);
                close_stream(fdin);
                free(algos);
+               self->dead = 1;
                return(e);
        }
 
@@ -165,6 +178,7 @@ handleClient(void *data)
                        close_stream(fout);
                        close_stream(fdin);
                        free(algos);
+                       self->dead = 1;
                        return(e);
                }
                algo = passwd + 1;
@@ -176,6 +190,7 @@ handleClient(void *data)
                        close_stream(fout);
                        close_stream(fdin);
                        free(algos);
+                       self->dead = 1;
                        return(e);
                }
                *s = 0;
@@ -187,6 +202,7 @@ handleClient(void *data)
                close_stream(fout);
                close_stream(fdin);
                free(algos);
+               self->dead = 1;
                return(e);
        }
 
@@ -202,6 +218,7 @@ handleClient(void *data)
                close_stream(fout);
                close_stream(fdin);
                free(algos);
+               self->dead = 1;
                return(e);
        }
 
@@ -220,6 +237,7 @@ handleClient(void *data)
                        close_stream(fout);
                        close_stream(fdin);
                        free(algos);
+                       self->dead = 1;
                        return(e);
                } else {
                        *s = '\0';
@@ -234,6 +252,7 @@ handleClient(void *data)
                close_stream(fout);
                close_stream(fdin);
                free(algos);
+               self->dead = 1;
                return(newErr("client %s specified no database", host));
        }
 
@@ -244,6 +263,7 @@ handleClient(void *data)
                close_stream(fout);
                close_stream(fdin);
                free(algos);
+               self->dead = 1;
                return(NO_ERR);
        }
 
@@ -273,6 +293,7 @@ handleClient(void *data)
                close_stream(fout);
                close_stream(fdin);
                free(algos);
+               self->dead = 1;
                return(e);
        }
        stat = top;
@@ -285,6 +306,7 @@ handleClient(void *data)
                multiplexAddClient(top->dbname, sock, fout, fdin, host);
                msab_freeStatus(&top);
                free(algos);
+               self->dead = 1;
                return(NO_ERR);
        }
 
@@ -314,6 +336,7 @@ handleClient(void *data)
                close_stream(fdin);
                msab_freeStatus(&top);
                free(algos);
+               self->dead = 1;
                return(e);
        }
 
@@ -384,12 +407,14 @@ handleClient(void *data)
                        Mfprintf(stdout, "starting a proxy failed: %s\n", e);
                        msab_freeStatus(&top);
                        free(algos);
+                       self->dead = 1;
                        return(e);
                };
        }
 
        msab_freeStatus(&top);
        free(algos);
+       self->dead = 1;
        return(NO_ERR);
 }
 
@@ -403,10 +428,7 @@ acceptConnections(int sock, int usock)
        void *e;
        struct timeval tv;
        struct clientdata *data;
-       struct threads {
-               struct threads *next;
-               pthread_t tid;
-       } *threads = NULL, **threadp, *p;
+       struct threads *threads = NULL, **threadp, *p;
 
        do {
                /* handle socket connections */
@@ -422,7 +444,8 @@ acceptConnections(int sock, int usock)
                /* join any handleClient threads that we started and that may
                 * have finished by now */
                for (threadp = &threads; *threadp; threadp = &(*threadp)->next) 
{
-                       if (pthread_tryjoin_np((*threadp)->tid, &e) == 0) {
+                       if ((*threadp)->dead &&
+                               pthread_join((*threadp)->tid, &e) == 0) {
                                p = *threadp;
                                *threadp = p->next;
                                free(p);
@@ -529,6 +552,8 @@ acceptConnections(int sock, int usock)
                data->sock = msgsock;
                data->isusock = FD_ISSET(usock, &fds);
                p = malloc(sizeof(*p)); /* freed by handleClient */
+               p->dead = 0;
+               data->self = p;
                if (pthread_create(&p->tid, NULL, handleClient, data) == 0) {
                        p->next = threads;
                        threads = p;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to