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