Commit 9ed2960d authored by Russ Cox's avatar Russ Cox

in hash implementation, if data >= 8, align to 8.

R=ken
OCL=23519
CL=23521
parent 3c5f3a86
...@@ -23,6 +23,7 @@ struct hash { /* a hash table; initialize with hash_init() */ ...@@ -23,6 +23,7 @@ struct hash { /* a hash table; initialize with hash_init() */
uint32 keysize; uint32 keysize;
uint32 valsize; uint32 valsize;
uint32 datavo;
uint32 ko; uint32 ko;
uint32 vo; uint32 vo;
uint32 po; uint32 po;
...@@ -674,7 +675,14 @@ sys·newmap(uint32 keysize, uint32 valsize, ...@@ -674,7 +675,14 @@ sys·newmap(uint32 keysize, uint32 valsize,
} }
h = mal(sizeof(*h)); h = mal(sizeof(*h));
hash_init(h, keysize+valsize,
// align value inside data so that mark-sweep gc can find it.
// might remove in the future and just assume datavo == keysize.
h->datavo = keysize;
if(valsize >= sizeof(void*))
h->datavo = rnd(keysize, sizeof(void*));
hash_init(h, h->datavo+valsize,
algarray[keyalg].hash, algarray[keyalg].hash,
algarray[keyalg].equal, algarray[keyalg].equal,
donothing, donothing,
...@@ -684,8 +692,9 @@ sys·newmap(uint32 keysize, uint32 valsize, ...@@ -684,8 +692,9 @@ sys·newmap(uint32 keysize, uint32 valsize,
h->valsize = valsize; h->valsize = valsize;
h->keyalg = &algarray[keyalg]; h->keyalg = &algarray[keyalg];
h->valalg = &algarray[valalg]; h->valalg = &algarray[valalg];
// these calculations are compiler dependent // these calculations are compiler dependent.
// figure out offsets of map call arguments.
h->ko = rnd(sizeof(h), keysize); h->ko = rnd(sizeof(h), keysize);
h->vo = rnd(h->ko+keysize, valsize); h->vo = rnd(h->ko+keysize, valsize);
h->po = rnd(h->vo+valsize, 1); h->po = rnd(h->vo+valsize, 1);
...@@ -729,7 +738,7 @@ sys·mapaccess1(Hmap *h, ...) ...@@ -729,7 +738,7 @@ sys·mapaccess1(Hmap *h, ...)
hit = hash_lookup(h, ak, (void**)&res); hit = hash_lookup(h, ak, (void**)&res);
if(!hit) if(!hit)
throw("sys·mapaccess1: key not in map"); throw("sys·mapaccess1: key not in map");
h->valalg->copy(h->valsize, av, res+h->keysize); h->valalg->copy(h->valsize, av, res+h->datavo);
if(debug) { if(debug) {
prints("sys·mapaccess1: map="); prints("sys·mapaccess1: map=");
...@@ -765,7 +774,7 @@ sys·mapaccess2(Hmap *h, ...) ...@@ -765,7 +774,7 @@ sys·mapaccess2(Hmap *h, ...)
h->valalg->copy(h->valsize, av, nil); h->valalg->copy(h->valsize, av, nil);
} else { } else {
*ap = true; *ap = true;
h->valalg->copy(h->valsize, av, res+h->keysize); h->valalg->copy(h->valsize, av, res+h->datavo);
} }
if(debug) { if(debug) {
...@@ -794,7 +803,7 @@ mapassign(Hmap *h, byte *ak, byte *av) ...@@ -794,7 +803,7 @@ mapassign(Hmap *h, byte *ak, byte *av)
res = nil; res = nil;
hit = hash_insert(h, ak, (void**)&res); hit = hash_insert(h, ak, (void**)&res);
h->keyalg->copy(h->keysize, res, ak); h->keyalg->copy(h->keysize, res, ak);
h->valalg->copy(h->valsize, res+h->keysize, av); h->valalg->copy(h->valsize, res+h->datavo, av);
if(debug) { if(debug) {
prints("mapassign: map="); prints("mapassign: map=");
...@@ -929,7 +938,7 @@ sys·mapiter2(struct hash_iter *it, ...) ...@@ -929,7 +938,7 @@ sys·mapiter2(struct hash_iter *it, ...)
throw("sys·mapiter2: key:val nil pointer"); throw("sys·mapiter2: key:val nil pointer");
h->keyalg->copy(h->keysize, ak, res); h->keyalg->copy(h->keysize, ak, res);
h->valalg->copy(h->valsize, av, res+h->keysize); h->valalg->copy(h->valsize, av, res+h->datavo);
if(debug) { if(debug) {
prints("mapiter2: iter="); prints("mapiter2: iter=");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment