]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix OASWB rewriting in racewalk
authorDavid Chase <drchase@google.com>
Fri, 10 Jun 2016 15:51:46 +0000 (11:51 -0400)
committerDavid Chase <drchase@google.com>
Sun, 12 Jun 2016 23:58:25 +0000 (23:58 +0000)
Special case for rewriting OAS inits omitted OASWB, added
that and OAS2FUNC.  The special case cannot be default case,
that causes racewalk to fail in horrible ways.

Fixes #16008.

Change-Id: Ie0d2f5735fe9d8255a109597b36d196d4f86703a
Reviewed-on: https://go-review.googlesource.com/23954
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/racewalk.go
test/fixedbugs/issue16008.go [new file with mode: 0644]

index 4a658b197665e9fc0a474c31fdf216e7121d788c..ad2bba971427dd380b1dc8d1439d436745038cb4 100644 (file)
@@ -164,7 +164,7 @@ func instrumentnode(np **Node, init *Nodes, wr int, skip int) {
                                var outn Nodes
                                outn.Set(out)
                                instrumentnode(&ls[i], &outn, 0, 0)
-                               if ls[i].Op != OAS || ls[i].Ninit.Len() == 0 {
+                               if ls[i].Op != OAS && ls[i].Op != OASWB && ls[i].Op != OAS2FUNC || ls[i].Ninit.Len() == 0 {
                                        out = append(outn.Slice(), ls[i])
                                } else {
                                        // Splice outn onto end of ls[i].Ninit
diff --git a/test/fixedbugs/issue16008.go b/test/fixedbugs/issue16008.go
new file mode 100644 (file)
index 0000000..1b516fb
--- /dev/null
@@ -0,0 +1,52 @@
+// errorcheck -0 -race
+
+package foo
+
+const benchmarkNumNodes = 10000
+
+func BenchmarkUpdateNodeTransaction(b B) {
+       s, nodeIDs := setupNodes(benchmarkNumNodes)
+       b.ResetTimer()
+       for i := 0; i < b.N(); i++ {
+               _ = s.Update(func(tx1 Tx) error {
+                       _ = UpdateNode(tx1, &Node{
+                               ID: nodeIDs[i%benchmarkNumNodes],
+                       })
+                       return nil
+               })
+       }
+}
+
+type B interface {
+       ResetTimer()
+       N() int
+}
+
+type Tx interface {
+}
+
+type Node struct {
+       ID string
+}
+
+type MemoryStore struct {
+}
+
+// go:noinline
+func setupNodes(n int) (s *MemoryStore, nodeIDs []string) {
+       return
+}
+
+//go:noinline
+func (s *MemoryStore) Update(cb func(Tx) error) error {
+       return nil
+}
+
+var sink interface{}
+
+//go:noinline
+func UpdateNode(tx Tx, n *Node) error {
+       sink = tx
+       sink = n
+       return nil
+}