]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: allow stack split in body of closechan
authorDmitriy Vyukov <dvyukov@google.com>
Mon, 22 Jul 2013 16:47:39 +0000 (20:47 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Mon, 22 Jul 2013 16:47:39 +0000 (20:47 +0400)
This gives more space during the call to runtime.lock.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/11679043

src/pkg/runtime/chan.c

index 6aa9bd40e1267d66ee84b93f351d964663590f12..c750faba498a46286a7ec605f80556fc02ae8dcf 100644 (file)
@@ -1214,10 +1214,27 @@ reflect·rselect(Slice cases, intgo chosen, uintptr word, bool recvOK)
        FLUSH(&recvOK);
 }
 
+static void closechan(Hchan *c, void *pc);
+
 // closechan(sel *byte);
 #pragma textflag 7
 void
 runtime·closechan(Hchan *c)
+{
+       closechan(c, runtime·getcallerpc(&c));
+}
+
+// For reflect
+//     func chanclose(c chan)
+#pragma textflag 7
+void
+reflect·chanclose(Hchan *c)
+{
+       closechan(c, runtime·getcallerpc(&c));
+}
+
+static void
+closechan(Hchan *c, void *pc)
 {
        SudoG *sg;
        G* gp;
@@ -1235,7 +1252,7 @@ runtime·closechan(Hchan *c)
        }
 
        if(raceenabled) {
-               runtime·racewritepc(c, runtime·getcallerpc(&c), runtime·closechan);
+               runtime·racewritepc(c, pc, runtime·closechan);
                runtime·racerelease(c);
        }
 
@@ -1264,14 +1281,6 @@ runtime·closechan(Hchan *c)
        runtime·unlock(c);
 }
 
-// For reflect
-//     func chanclose(c chan)
-void
-reflect·chanclose(Hchan *c)
-{
-       runtime·closechan(c);
-}
-
 // For reflect
 //     func chanlen(c chan) (len int)
 void