aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/hashmap.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-01-09 09:47:45 -0800
committerRuss Cox <rsc@golang.org>2010-01-09 09:47:45 -0800
commit5328df6534b9fa2ca83cbbac013ef1e094e11907 (patch)
tree0a6fa7c1c69e10eb519d896d2634b6662999e835 /src/pkg/runtime/hashmap.c
parent752b1702d03fbc4377fe856a378c7fa4abbb006f (diff)
downloadgo-5328df6534b9fa2ca83cbbac013ef1e094e11907.tar.xz
runtime: check for preemption due to garbage collection
in various already expensive routines. helps keep cpu utilization up when GOMAXPROCS > 1, but not a full solution. http://groups.google.com/group/golang-nuts/t/7a9535c4136d3e2 R=r CC=golang-dev https://golang.org/cl/184043
Diffstat (limited to 'src/pkg/runtime/hashmap.c')
-rw-r--r--src/pkg/runtime/hashmap.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/pkg/runtime/hashmap.c b/src/pkg/runtime/hashmap.c
index 870274ae91..5bcd8bf416 100644
--- a/src/pkg/runtime/hashmap.c
+++ b/src/pkg/runtime/hashmap.c
@@ -744,6 +744,9 @@ mapaccess(Hmap *h, byte *ak, byte *av, bool *pres)
{
byte *res;
+ if(gcwaiting)
+ gosched();
+
res = nil;
if(hash_lookup(h, ak, (void**)&res)) {
*pres = true;
@@ -812,6 +815,9 @@ mapassign(Hmap *h, byte *ak, byte *av)
byte *res;
int32 hit;
+ if(gcwaiting)
+ gosched();
+
res = nil;
if(av == nil) {
hash_remove(h, ak, (void**)&res);
@@ -908,6 +914,9 @@ mapiterinit(Hmap *h)
void
runtime·mapiternext(struct hash_iter *it)
{
+ if(gcwaiting)
+ gosched();
+
it->data = hash_next(it);
if(debug) {
prints("runtime·mapiternext: iter=");