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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list