- 10 Apr, 2014 9 commits
-
-
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
-
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
-
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
-
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
-
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
-
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
-
Andrew Gerrand authored
Generated by addca. R=gobot CC=golang-codereviews https://golang.org/cl/85550044
-
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
-
Robert Griesemer authored
Fixes #7745. LGTM=bradfitz, r R=r, bradfitz CC=golang-codereviews https://golang.org/cl/86220044
-
- 09 Apr, 2014 19 commits
-
-
Robert Griesemer authored
Also: - fix error messages in tests - make tests more symmetric Fixes #7607. LGTM=r R=r CC=golang-codereviews https://golang.org/cl/86180043
-
Rob Pike authored
Explain what its purpose is and give examples of good and bad use. Fixes #7167. LGTM=dvyukov, rsc R=golang-codereviews, dvyukov, rsc CC=golang-codereviews https://golang.org/cl/85880044
-
Rémy Oudompheng authored
On amd64p32 pointers are 32-bit-aligned and cannot be assumed to have an offset multiple of widthreg. Instead check that they are withptr-aligned. Also change the threshold for region merging to 2*widthreg instead of 2*widthptr because performance on amd64 and amd64p32 is expected to be the same. Fixes #7712. LGTM=khr R=rsc, dave, khr, brad, bradfitz CC=golang-codereviews https://golang.org/cl/84690044
-
Rui Ueyama authored
go-mode on Emacs 23 wrongly recognizes a backquote in a comment or a string as a start of a raw string literal. Below is an example that go-mode does not work well. This patch is to fix that issue. // ` var x = 1 // ` LGTM=dominik.honnef R=golang-codereviews, dominik.honnef, adonovan CC=golang-codereviews https://golang.org/cl/84900043
-
Russ Cox authored
Cuts the number of calls from 6 to 2 in the non-debug case. LGTM=iant R=golang-codereviews, iant CC=0intro, aram, golang-codereviews, khr https://golang.org/cl/86040043
-
Russ Cox authored
Suggested in comments on CL 85740043. LGTM=aram R=golang-codereviews, aram CC=dave, golang-codereviews, r https://golang.org/cl/85990044
-
Russ Cox authored
TBR=iant CC=golang-codereviews https://golang.org/cl/86030043
-
Jan Ziak authored
LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/85890043
-
Jan Ziak authored
Fixes #6889 LGTM=rsc R=gri, rsc CC=golang-codereviews https://golang.org/cl/85080044
-
Jan Ziak authored
Fixes #7538 LGTM=rsc R=gri, rsc CC=golang-codereviews https://golang.org/cl/85040045
-
Rob Pike authored
1) The code to catch an exception marked the template as escaped when it was not yet, which caused subsequent executions of the template to not escape properly. 2) ensurePipelineContains needs to handled Field as well as Identifier nodes. Fixes #7379. LGTM=mikesamuel R=mikesamuel CC=golang-codereviews https://golang.org/cl/85240043
-
Rob Pike authored
LGTM=iant R=golang-codereviews, iant CC=golang-codereviews https://golang.org/cl/85840043
-
David du Colombier authored
Getenv() should not call malloc when called from gotraceback(). Instead, we return a static buffer in this case, with enough room to hold the longest value. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/85680043
-
Rob Pike authored
LGTM=rsc R=rsc, bradfitz CC=golang-codereviews https://golang.org/cl/85740043
-
Brad Fitzpatrick authored
LGTM=r R=r CC=golang-codereviews https://golang.org/cl/85760043
-
Russ Cox authored
On Plan 9 gotraceback calls getenv calls malloc, and we gotraceback on every call to gentraceback, which happens during garbage collection. Honestly I don't even know how this works on Plan 9. I suspect it does not, and that we are getting by because no one has tried to run with $GOTRACEBACK set at all. This will speed up all the other systems by epsilon, since they won't call getenv and atoi repeatedly. LGTM=bradfitz R=golang-codereviews, bradfitz, 0intro CC=golang-codereviews https://golang.org/cl/85430046
-
Rick Arnold authored
Add a $Context variable to the template so that the build.Context values such as BuildTags can be accessed. Fixes #6666. LGTM=adg, rsc R=golang-codereviews, gobot, adg, rsc CC=golang-codereviews https://golang.org/cl/72770043
-
Carl Chatfield authored
Short circuit for calling values funcs by MakeFunc was placed before variadic arg rearrangement code in reflect.call. Fixes #7534. LGTM=khr R=golang-codereviews, bradfitz, khr, rsc CC=golang-codereviews https://golang.org/cl/75370043
-
Russ Cox authored
Generated by addca. R=gobot CC=golang-codereviews https://golang.org/cl/85820043
-
- 08 Apr, 2014 12 commits
-
-
Rob Pike authored
LGTM=iant R=iant CC=golang-codereviews https://golang.org/cl/85720043
-
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
-
Rob Pike authored
LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews https://golang.org/cl/85660043
-
Rob Pike authored
LGTM=dvyukov, iant, rsc R=golang-codereviews, dvyukov, iant, rsc CC=golang-codereviews https://golang.org/cl/85250043
-
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
-
Josh Bleecher Snyder authored
Fixes #6836. LGTM=rsc R=golang-codereviews, rsc, r, mike CC=golang-codereviews https://golang.org/cl/33140043
-
Alexander Zhavnerchik authored
Fixes #7614. LGTM=rsc R=golang-codereviews, r, rsc, dan.kortschak, applezinc CC=golang-codereviews https://golang.org/cl/79210044
-
Russ Cox authored
Generated by addca. R=gobot CC=golang-codereviews https://golang.org/cl/85490043
-
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
-
Dmitriy Vyukov authored
It turns out there is a relatively common pattern that relies on inverted channel semaphore: gate := make(chan bool, N) for ... { // limit concurrency gate <- true go func() { foo(...) <-gate }() } // join all goroutines for i := 0; i < N; i++ { gate <- true } So handle synchronization on inverted semaphores with cap>1. Fixes #7718. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/84880046
-
Ian Lance Taylor authored
This code tests linkmode == LinkExternal but is only invoked by the compiler/assembler, not the linker. Update #7164 LGTM=rsc R=rsc, dave CC=golang-codereviews https://golang.org/cl/85080043
-
Rob Pike authored
LGTM=bradfitz, alex.brainman R=golang-codereviews, bradfitz, alex.brainman CC=golang-codereviews https://golang.org/cl/85190043
-