1. 05 Dec, 2014 5 commits
    • Russ Cox's avatar
      [dev.cc] all: merge default (8d42099cdc23) into dev.cc · 829b286f
      Russ Cox authored
      TBR=austin
      CC=golang-codereviews
      https://golang.org/cl/178700044
      829b286f
    • Austin Clements's avatar
      [dev.cc] liblink: don't patch jumps to jumps to symbols · e04c8b06
      Austin Clements authored
      When liblink sees something like
      
             JMP x
             ...
          x: JMP y
      
      it rewrites the first jump to jump directly to y.  This is
      fine if y is a resolved label.  However, it *also* does this
      if y is a function symbol, but fails to carry over the
      relocation that would later patch in that symbol's value.  As
      a result, the original jump becomes either a self-jump (if
      relative) or a jump to PC 0 (if absolute).
      
      Fix this by disabling this optimization if the jump being
      patched in is a jump to a symbol.
      
      LGTM=minux
      R=rsc, minux
      CC=golang-codereviews
      https://golang.org/cl/185890044
      e04c8b06
    • Shenghou Ma's avatar
      [dev.cc] cmd/ld: finalize linkmode before determining whether to import runtime/cgo · 274976f4
      Shenghou Ma authored
      Frankly, I don't understand how the current code could possibly work except
      when every android program is using cgo. Discovered this while working on
      the iOS port.
      
      LGTM=crawshaw, rsc
      R=rsc, crawshaw
      CC=golang-codereviews
      https://golang.org/cl/177470043
      274976f4
    • Rob Pike's avatar
      cmd/go: fix build · 41c6b843
      Rob Pike authored
      The new semantics of split require the newline be present.
      The test was stale.
      
      LGTM=adg
      R=golang-codereviews, adg
      CC=golang-codereviews
      https://golang.org/cl/182480043
      41c6b843
    • Rob Pike's avatar
      cmd/go: avoid use of bufio.Scanner in generate · dd26fc38
      Rob Pike authored
      Scanner can't handle stupid long lines and there are
      reports of stupid long lines in production.
      
      Note the issue isn't long "//go:generate" lines, but
      any long line in any Go source file.
      
      To be fair, if you're going to have a stupid long line
      it's not a bad bet you'll want to run it through go
      generate, because it's some embeddable asset that
      has been machine generated. (One could ask why
      that generation process didn't add a newline or two,
      but we should cope anyway.)
      
      Rewrite the file scanner in "go generate" so it can
      handle arbitrarily long lines, and only stores in memory
      those lines that start "//go:generate".
      
      Also: Adjust the documentation to make clear that it
      does not parse the file.
      
      Fixes #9143.
      Fixes #9196.
      
      LGTM=rsc, dominik.honnef
      R=rsc, cespare, minux, dominik.honnef
      CC=golang-codereviews
      https://golang.org/cl/182970043
      dd26fc38
  2. 04 Dec, 2014 2 commits
  3. 03 Dec, 2014 2 commits
  4. 02 Dec, 2014 2 commits
  5. 01 Dec, 2014 2 commits
    • Russ Cox's avatar
      runtime: fix hang in GC due to shrinkstack vs netpoll race · 2b62e1ea
      Russ Cox authored
      During garbage collection, after scanning a stack, we think about
      shrinking it to reclaim some memory. The shrinking code (called
      while the world is stopped) checked that the status was Gwaiting
      or Grunnable and then changed the state to Gcopystack, to essentially
      lock the stack so that no other GC thread is scanning it.
      The same locking happens for stack growth (and is more necessary there).
      
              oldstatus = runtime·readgstatus(gp);
              oldstatus &= ~Gscan;
              if(oldstatus == Gwaiting || oldstatus == Grunnable)
                      runtime·casgstatus(gp, oldstatus, Gcopystack); // oldstatus is Gwaiting or Grunnable
              else
                      runtime·throw("copystack: bad status, not Gwaiting or Grunnable");
      
      Unfortunately, "stop the world" doesn't stop everything. It stops all
      normal goroutine execution, but the network polling thread is still
      blocked in epoll and may wake up. If it does, and it chooses a goroutine
      to mark runnable, and that goroutine is the one whose stack is shrinking,
      then it can happen that between readgstatus and casgstatus, the status
      changes from Gwaiting to Grunnable.
      
      casgstatus assumes that if the status is not what is expected, it is a
      transient change (like from Gwaiting to Gscanwaiting and back, or like
      from Gwaiting to Gcopystack and back), and it loops until the status
      has been restored to the expected value. In this case, the status has
      changed semi-permanently from Gwaiting to Grunnable - it won't
      change again until the GC is done and the world can continue, but the
      GC is waiting for the status to change back. This wedges the program.
      
      To fix, call a special variant of casgstatus that accepts either Gwaiting
      or Grunnable as valid statuses.
      
      Without the fix bug with the extra check+throw in casgstatus, the
      program below dies in a few seconds (2-10) with GOMAXPROCS=8
      on a 2012 Retina MacBook Pro. With the fix, it runs for minutes
      and minutes.
      
      package main
      
      import (
              "io"
              "log"
              "net"
              "runtime"
      )
      
      func main() {
              const N = 100
              for i := 0; i < N; i++ {
                      l, err := net.Listen("tcp", "127.0.0.1:0")
                      if err != nil {
                              log.Fatal(err)
                      }
                      ch := make(chan net.Conn, 1)
                      go func() {
                              var err error
                              c1, err := net.Dial("tcp", l.Addr().String())
                              if err != nil {
                                      log.Fatal(err)
                              }
                              ch <- c1
                      }()
                      c2, err := l.Accept()
                      if err != nil {
                              log.Fatal(err)
                      }
                      c1 := <-ch
                      l.Close()
                      go netguy(c1, c2)
                      go netguy(c2, c1)
                      c1.Write(make([]byte, 100))
              }
              for {
                      runtime.GC()
              }
      }
      
      func netguy(r, w net.Conn) {
              buf := make([]byte, 100)
              for {
                      bigstack(1000)
                      _, err := io.ReadFull(r, buf)
                      if err != nil {
                              log.Fatal(err)
                      }
                      w.Write(buf)
              }
      }
      
      var g int
      
      func bigstack(n int) {
              var buf [100]byte
              if n > 0 {
                      bigstack(n - 1)
              }
              g = int(buf[0]) + int(buf[99])
      }
      
      Fixes #9186.
      
      LGTM=rlh
      R=austin, rlh
      CC=dvyukov, golang-codereviews, iant, khr, r
      https://golang.org/cl/179680043
      2b62e1ea
    • Keith Randall's avatar
      reflect: Fix reflect.funcLayout. The GC bitmap has two bits per · 7c1e3303
      Keith Randall authored
      pointer, not one.
      
      Fixes #9179
      
      LGTM=iant, rsc
      R=golang-codereviews, iant, rsc
      CC=golang-codereviews
      https://golang.org/cl/182160043
      7c1e3303
  6. 25 Nov, 2014 4 commits
  7. 24 Nov, 2014 3 commits
  8. 23 Nov, 2014 1 commit
  9. 22 Nov, 2014 4 commits
  10. 21 Nov, 2014 11 commits
  11. 20 Nov, 2014 4 commits