mirror of
https://github.com/golang/go
synced 2024-11-21 21:44:40 -07:00
runtime: clean up map code. Remove hashmap.h.
Use cnew/cnewarray instead of mallocgc. R=golang-dev, dvyukov CC=golang-dev https://golang.org/cl/13396045
This commit is contained in:
parent
fd0af9b56c
commit
23f9751e83
@ -5,7 +5,6 @@
|
|||||||
#include "runtime.h"
|
#include "runtime.h"
|
||||||
#include "arch_GOARCH.h"
|
#include "arch_GOARCH.h"
|
||||||
#include "malloc.h"
|
#include "malloc.h"
|
||||||
#include "hashmap.h"
|
|
||||||
#include "type.h"
|
#include "type.h"
|
||||||
#include "race.h"
|
#include "race.h"
|
||||||
#include "../../cmd/ld/textflag.h"
|
#include "../../cmd/ld/textflag.h"
|
||||||
@ -255,7 +254,7 @@ hash_init(MapType *t, Hmap *h, uint32 hint)
|
|||||||
// done lazily later.
|
// done lazily later.
|
||||||
buckets = nil;
|
buckets = nil;
|
||||||
} else {
|
} else {
|
||||||
buckets = runtime·mallocgc(bucketsize << B, (uintptr)t->bucket | TypeInfo_Array, 0);
|
buckets = runtime·cnewarray(t->bucket, (uintptr)1 << B);
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize Hmap
|
// initialize Hmap
|
||||||
@ -317,7 +316,7 @@ evacuate(MapType *t, Hmap *h, uintptr oldbucket)
|
|||||||
if((hash & newbit) == 0) {
|
if((hash & newbit) == 0) {
|
||||||
if(xi == BUCKETSIZE) {
|
if(xi == BUCKETSIZE) {
|
||||||
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
||||||
newx = runtime·mallocgc(h->bucketsize, (uintptr)t->bucket, 0);
|
newx = runtime·cnew(t->bucket);
|
||||||
x->overflow = newx;
|
x->overflow = newx;
|
||||||
x = newx;
|
x = newx;
|
||||||
xi = 0;
|
xi = 0;
|
||||||
@ -341,7 +340,7 @@ evacuate(MapType *t, Hmap *h, uintptr oldbucket)
|
|||||||
} else {
|
} else {
|
||||||
if(yi == BUCKETSIZE) {
|
if(yi == BUCKETSIZE) {
|
||||||
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
||||||
newy = runtime·mallocgc(h->bucketsize, (uintptr)t->bucket, 0);
|
newy = runtime·cnew(t->bucket);
|
||||||
y->overflow = newy;
|
y->overflow = newy;
|
||||||
y = newy;
|
y = newy;
|
||||||
yi = 0;
|
yi = 0;
|
||||||
@ -419,7 +418,7 @@ hash_grow(MapType *t, Hmap *h)
|
|||||||
old_buckets = h->buckets;
|
old_buckets = h->buckets;
|
||||||
// NOTE: this could be a big malloc, but since we don't need zeroing it is probably fast.
|
// NOTE: this could be a big malloc, but since we don't need zeroing it is probably fast.
|
||||||
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
||||||
new_buckets = runtime·mallocgc((uintptr)h->bucketsize << (h->B + 1), (uintptr)t->bucket | TypeInfo_Array, 0);
|
new_buckets = runtime·cnewarray(t->bucket, (uintptr)1 << (h->B + 1));
|
||||||
flags = (h->flags & ~(Iterator | OldIterator));
|
flags = (h->flags & ~(Iterator | OldIterator));
|
||||||
if((h->flags & Iterator) != 0)
|
if((h->flags & Iterator) != 0)
|
||||||
flags |= OldIterator;
|
flags |= OldIterator;
|
||||||
@ -578,7 +577,7 @@ hash_insert(MapType *t, Hmap *h, void *key, void *value)
|
|||||||
hash = h->hash0;
|
hash = h->hash0;
|
||||||
t->key->alg->hash(&hash, t->key->size, key);
|
t->key->alg->hash(&hash, t->key->size, key);
|
||||||
if(h->buckets == nil)
|
if(h->buckets == nil)
|
||||||
h->buckets = runtime·mallocgc(h->bucketsize, (uintptr)t->bucket | TypeInfo_Array, 0);
|
h->buckets = runtime·cnewarray(t->bucket, 1);
|
||||||
|
|
||||||
again:
|
again:
|
||||||
bucket = hash & (((uintptr)1 << h->B) - 1);
|
bucket = hash & (((uintptr)1 << h->B) - 1);
|
||||||
@ -625,7 +624,7 @@ hash_insert(MapType *t, Hmap *h, void *key, void *value)
|
|||||||
if(inserti == nil) {
|
if(inserti == nil) {
|
||||||
// all current buckets are full, allocate a new one.
|
// all current buckets are full, allocate a new one.
|
||||||
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
||||||
newb = runtime·mallocgc(h->bucketsize, (uintptr)t->bucket, 0);
|
newb = runtime·cnew(t->bucket);
|
||||||
b->overflow = newb;
|
b->overflow = newb;
|
||||||
inserti = newb->tophash;
|
inserti = newb->tophash;
|
||||||
insertk = newb->data;
|
insertk = newb->data;
|
||||||
@ -635,13 +634,13 @@ hash_insert(MapType *t, Hmap *h, void *key, void *value)
|
|||||||
// store new key/value at insert position
|
// store new key/value at insert position
|
||||||
if((h->flags & IndirectKey) != 0) {
|
if((h->flags & IndirectKey) != 0) {
|
||||||
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
||||||
kmem = runtime·mallocgc(t->key->size, (uintptr)t->key, 0);
|
kmem = runtime·cnew(t->key);
|
||||||
*(byte**)insertk = kmem;
|
*(byte**)insertk = kmem;
|
||||||
insertk = kmem;
|
insertk = kmem;
|
||||||
}
|
}
|
||||||
if((h->flags & IndirectValue) != 0) {
|
if((h->flags & IndirectValue) != 0) {
|
||||||
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
if(checkgc) mstats.next_gc = mstats.heap_alloc;
|
||||||
vmem = runtime·mallocgc(t->elem->size, (uintptr)t->elem, 0);
|
vmem = runtime·cnew(t->elem);
|
||||||
*(byte**)insertv = vmem;
|
*(byte**)insertv = vmem;
|
||||||
insertv = vmem;
|
insertv = vmem;
|
||||||
}
|
}
|
||||||
@ -929,7 +928,7 @@ runtime·makemap_c(MapType *typ, int64 hint)
|
|||||||
if(key->alg->hash == runtime·nohash)
|
if(key->alg->hash == runtime·nohash)
|
||||||
runtime·throw("runtime.makemap: unsupported map key type");
|
runtime·throw("runtime.makemap: unsupported map key type");
|
||||||
|
|
||||||
h = runtime·mallocgc(sizeof(*h), (uintptr)typ->hmap, 0);
|
h = runtime·cnew(typ->hmap);
|
||||||
hash_init(typ, h, hint);
|
hash_init(typ, h, hint);
|
||||||
|
|
||||||
// these calculations are compiler dependent.
|
// these calculations are compiler dependent.
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
@ -12,7 +12,6 @@
|
|||||||
#include "race.h"
|
#include "race.h"
|
||||||
#include "type.h"
|
#include "type.h"
|
||||||
#include "typekind.h"
|
#include "typekind.h"
|
||||||
#include "hashmap.h"
|
|
||||||
#include "funcdata.h"
|
#include "funcdata.h"
|
||||||
#include "../../cmd/ld/textflag.h"
|
#include "../../cmd/ld/textflag.h"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user