1. 10 Apr, 2014 12 commits
    • Russ Cox's avatar
      runtime: make times in GODEBUG=gctrace=1 output clearer · 5539ef02
      Russ Cox authored
      TBR=0intro
      CC=golang-codereviews
      https://golang.org/cl/86620043
      5539ef02
    • Keith Randall's avatar
      cmd/6g: nacl: zero odd multiple of widthptr correctly · bfbb2e82
      Keith Randall authored
      LGTM=iant
      R=remyoudompheng, iant
      CC=golang-codereviews
      https://golang.org/cl/86270043
      bfbb2e82
    • Rui Ueyama's avatar
      sync: fix spurious wakeup from WaitGroup.Wait · e9347c78
      Rui Ueyama authored
      There is a race condition that causes spurious wakeup from Wait
      in the following case:
      
       G1: decrement wg.counter, observe the counter is now 0
           (should unblock goroutines queued *at this moment*)
       G2: increment wg.counter
       G2: call Wait() to add itself to the wait queue
       G1: acquire wg.m, unblock all waiting goroutines
      
      In the last step G2 is spuriously woken up by G1.
      Fixes #7734.
      
      LGTM=rsc, dvyukov
      R=dvyukov, 0xjnml, rsc
      CC=golang-codereviews
      https://golang.org/cl/85580043
      e9347c78
    • Brad Fitzpatrick's avatar
      net/http: don't reuse Transport connection unless Request.Write finished · 6278a954
      Brad Fitzpatrick authored
      In a typical HTTP request, the client writes the request, and
      then the server replies. Go's HTTP client code (Transport) has
      two goroutines per connection: one writing, and one reading. A
      third goroutine (the one initiating the HTTP request)
      coordinates with those two.
      
      Because most HTTP requests are done when the server replies,
      the Go code has always handled connection reuse purely in the
      readLoop goroutine.
      
      But if a client is writing a large request and the server
      replies before it's consumed the entire request (e.g. it
      replied with a 403 Forbidden and had no use for the body), it
      was possible for Go to re-select that connection for a
      subsequent request before we were done writing the first. That
      wasn't actually a data race; the second HTTP request would
      just get enqueued to write its request on the writeLoop. But
      because the previous writeLoop didn't finish writing (and
      might not ever), that connection is in a weird state. We
      really just don't want to get into a state where we're
      re-using a connection when the server spoke out of turn.
      
      This CL changes the readLoop goroutine to verify that the
      writeLoop finished before returning the connection.
      
      In the process, it also fixes a potential goroutine leak where
      a connection could close but the recycling logic could be
      blocked forever waiting for the client to read to EOF or
      error. Now it also selects on the persistConn's close channel,
      and the closer of that is no longer the readLoop (which was
      dead locking in some cases before). It's now closed at the
      same place the underlying net.Conn is closed. This likely fixes
      or helps Issue 7620.
      
      Also addressed some small cosmetic things in the process.
      
      Update #7620
      Fixes #7569
      
      LGTM=adg
      R=golang-codereviews, adg
      CC=dsymonds, golang-codereviews, rsc
      https://golang.org/cl/86290043
      6278a954
    • David du Colombier's avatar
      runtime: no longer skip stack growth test in short mode · d7ac73c8
      David du Colombier authored
      We originally decided to skip this test in short mode
      to prevent the parallel runtime test to timeout on the
      Plan 9 builder. This should no longer be required since
      the issue was fixed in CL 86210043.
      
      LGTM=dave, bradfitz
      R=dvyukov, dave, bradfitz
      CC=golang-codereviews, rsc
      https://golang.org/cl/84790044
      d7ac73c8
    • David du Colombier's avatar
      runtime: fix semasleep on Plan 9 · 5a513061
      David du Colombier authored
      If you pass ns = 100,000 to this function, timediv will
      return ms = 0. tsemacquire in /sys/src/9/port/sysproc.c
      will return immediately when ms == 0 and the semaphore
      cannot be acquired immediately - it doesn't sleep - so
      notetsleep will spin, chewing cpu and repeatedly reading
      the time, until the 100us have passed.
      
      Thanks to the time reads it won't take too many iterations,
      but whatever we are waiting for does not get a chance to
      run. Eventually the notetsleep spin loop returns and we
      end up in the stoptheworld spin loop - actually a sleep
      loop but we're not doing a good job of sleeping.
      
      After 100ms or so of this, the kernel says enough and
      schedules a different thread. That thread manages to do
      whatever we're waiting for, and the spinning in the other
      thread stops. If tsemacquire had actually slept, this
      would have happened much quicker.
      
      Many thanks to Russ Cox for help debugging.
      
      LGTM=rsc
      R=rsc
      CC=golang-codereviews
      https://golang.org/cl/86210043
      5a513061
    • Rob Pike's avatar
      doc/go1.3.html: minor changes: crypto, net · b6684b31
      Rob Pike authored
      All that's left is net/http and the stuff I need help describing: FreeBSD and Windows.
      
      LGTM=adg
      R=golang-codereviews, adg
      CC=golang-codereviews
      https://golang.org/cl/86320043
      b6684b31
    • Alex Brainman's avatar
      cmd/go: always build package during "go test" command · c8f90979
      Alex Brainman authored
      even when there are no *_test.go files present.
      rsc suggested this change
      
      Fixes #7108
      
      LGTM=r, adg
      R=golang-codereviews, r, adg
      CC=golang-codereviews
      https://golang.org/cl/84300043
      c8f90979
    • Preetam Jinka's avatar
      syscall: fix Getfsstat() for BSD · 4abbd4a4
      Preetam Jinka authored
      The buffer length should be the size in bytes
      instead of the number of structs.
      
      Fixes #6588.
      
      LGTM=mikioh.mikioh
      R=golang-codereviews, mikioh.mikioh, adg
      CC=golang-codereviews
      https://golang.org/cl/84830043
      4abbd4a4
    • Andrew Gerrand's avatar
      A+C: Preetam Jinka (individual CLA) · 0b0e8070
      Andrew Gerrand authored
      Generated by addca.
      
      R=gobot
      CC=golang-codereviews
      https://golang.org/cl/85550044
      0b0e8070
    • Robert Griesemer's avatar
      undo CL 86220044 / 41388e58be65 · 34a21dca
      Robert Griesemer authored
      bufio: undo incorrect bug fix
      
      ««« original CL description
      bufio: fix potential endless loop in ReadByte
      
      Fixes #7745.
      
      LGTM=bradfitz, r
      R=r, bradfitz
      CC=golang-codereviews
      https://golang.org/cl/86220044
      »»»
      
      LGTM=adg
      R=r, adg
      CC=golang-codereviews
      https://golang.org/cl/85550045
      34a21dca
    • Robert Griesemer's avatar
      bufio: fix potential endless loop in ReadByte · b38fba21
      Robert Griesemer authored
      Fixes #7745.
      
      LGTM=bradfitz, r
      R=r, bradfitz
      CC=golang-codereviews
      https://golang.org/cl/86220044
      b38fba21
  2. 09 Apr, 2014 19 commits
  3. 08 Apr, 2014 9 commits
    • Rob Pike's avatar
      doc/go1.3.html: gccgo status · 96775a36
      Rob Pike authored
      LGTM=iant
      R=iant
      CC=golang-codereviews
      https://golang.org/cl/85720043
      96775a36
    • Adam Langley's avatar
      crypto/(ec)dsa: use Fermat's inversion. · f23d3ea8
      Adam Langley authored
      Now that we have a constant-time P-256 implementation, it's worth
      paying more attention elsewhere.
      
      The inversion of k in (EC)DSA was using Euclid's algorithm which isn't
      constant-time. This change switches to Fermat's algorithm, which is
      much better. However, it's important to note that math/big itself isn't
      constant time and is using a 4-bit window for exponentiation with
      variable memory access patterns.
      
      (Since math/big depends quite deeply on its values being in minimal (as
      opposed to fixed-length) represetation, perhaps crypto/elliptic should
      grow a constant-time implementation of exponentiation in the scalar
      field.)
      
      R=bradfitz
      Fixes #7652.
      
      LGTM=rsc
      R=golang-codereviews, bradfitz, rsc
      CC=golang-codereviews
      https://golang.org/cl/82740043
      f23d3ea8
    • Rob Pike's avatar
      doc/go1.3.html: linker, go command, miscellany · c5f14c55
      Rob Pike authored
      LGTM=bradfitz
      R=golang-codereviews, bradfitz
      CC=golang-codereviews
      https://golang.org/cl/85660043
      c5f14c55
    • Rob Pike's avatar
      doc/go1.3.html: Performance, plus some library details · 969dc762
      Rob Pike authored
      LGTM=dvyukov, iant, rsc
      R=golang-codereviews, dvyukov, iant, rsc
      CC=golang-codereviews
      https://golang.org/cl/85250043
      969dc762
    • Robert Griesemer's avatar
      go/doc: fix URL matched in ToHTML · 9610b616
      Robert Griesemer authored
      Permit paired parentheses in URLs such as:
      
      http://en.wikipedia.org/wiki/Camellia_(cipher)
      
      Fixes #5043.
      
      LGTM=rsc
      R=rsc
      CC=golang-codereviews
      https://golang.org/cl/85610043
      9610b616
    • Josh Bleecher Snyder's avatar
      encoding/xml: unmarshal into interfaces · e79bab30
      Josh Bleecher Snyder authored
      Fixes #6836.
      
      LGTM=rsc
      R=golang-codereviews, rsc, r, mike
      CC=golang-codereviews
      https://golang.org/cl/33140043
      e79bab30
    • Alexander Zhavnerchik's avatar
      encoding/xml: Makes XML Marshaler take into account XMLName field from anonymous field · 4b42ad25
      Alexander Zhavnerchik authored
      Fixes #7614.
      
      LGTM=rsc
      R=golang-codereviews, r, rsc, dan.kortschak, applezinc
      CC=golang-codereviews
      https://golang.org/cl/79210044
      4b42ad25
    • Russ Cox's avatar
      A+C: Alexander Zhavnerchik (individual CLA) · 3b570d0a
      Russ Cox authored
      Generated by addca.
      
      R=gobot
      CC=golang-codereviews
      https://golang.org/cl/85490043
      3b570d0a
    • Russ Cox's avatar
      reflect, runtime: fix crash in GC due to reflect.call + precise GC · 72c5d5e7
      Russ Cox authored
      Given
              type Outer struct {
                      *Inner
                      ...
              }
      the compiler generates the implementation of (*Outer).M dispatching to
      the embedded Inner. The implementation is logically:
              func (p *Outer) M() {
                      (p.Inner).M()
              }
      but since the only change here is the replacement of one pointer
      receiver with another, the actual generated code overwrites the
      original receiver with the p.Inner pointer and then jumps to the M
      method expecting the *Inner receiver.
      
      During reflect.Value.Call, we create an argument frame and the
      associated data structures to describe it to the garbage collector,
      populate the frame, call reflect.call to run a function call using
      that frame, and then copy the results back out of the frame. The
      reflect.call function does a memmove of the frame structure onto the
      stack (to set up the inputs), runs the call, and the memmoves the
      stack back to the frame structure (to preserve the outputs).
      
      Originally reflect.call did not distinguish inputs from outputs: both
      memmoves were for the full stack frame. However, in the case where the
      called function was one of these wrappers, the rewritten receiver is
      almost certainly a different type than the original receiver. This is
      not a problem on the stack, where we use the program counter to
      determine the type information and understand that during (*Outer).M
      the receiver is an *Outer while during (*Inner).M the receiver in the
      same memory word is now an *Inner. But in the statically typed
      argument frame created by reflect, the receiver is always an *Outer.
      Copying the modified receiver pointer off the stack into the frame
      will store an *Inner there, and then if a garbage collection happens
      to scan that argument frame before it is discarded, it will scan the
      *Inner memory as if it were an *Outer. If the two have different
      memory layouts, the collection will intepret the memory incorrectly.
      
      Fix by only copying back the results.
      
      Fixes #7725.
      
      LGTM=khr
      R=khr
      CC=dave, golang-codereviews
      https://golang.org/cl/85180043
      72c5d5e7