]> Cypherpunks repositories - gostls13.git/log
gostls13.git
11 years agoA+C: Maxim Khitrov (individual CLA)
Adam Langley [Fri, 17 Jan 2014 16:26:42 +0000 (11:26 -0500)]
A+C: Maxim Khitrov (individual CLA)

Generated by addca.

R=gobot
CC=golang-codereviews
https://golang.org/cl/53730043

11 years agosyscall: mark arguments to Syscall as noescape
Dmitriy Vyukov [Fri, 17 Jan 2014 16:18:37 +0000 (20:18 +0400)]
syscall: mark arguments to Syscall as noescape
Heap arguments to "async" syscalls will break when/if we have moving GC anyway.
With this change is must not break until moving GC, because a user must
reference the object in Go to preserve liveness. Otherwise the code is broken already.
Reduces number of leaked params from 125 to 36 on linux.

R=golang-codereviews, mikioh.mikioh, bradfitz
CC=cshapiro, golang-codereviews, khr, rsc
https://golang.org/cl/45930043

11 years agocrypto/cipher: improved cbc performance
Luke Curley [Fri, 17 Jan 2014 16:07:04 +0000 (11:07 -0500)]
crypto/cipher: improved cbc performance

decrypt: reduced the number of copy calls from 2n to 1.
encrypt: reduced the number of copy calls from n to 1.

Encryption is straight-forward: use dst instead of tmp when
xoring the block with the iv.

Decryption now loops backwards through the blocks abusing the
fact that the previous block's ciphertext (src) is the iv. This
means we don't need to copy the iv every time, in addition to
using dst instead of tmp like encryption.

R=golang-codereviews, agl, mikioh.mikioh
CC=golang-codereviews
https://golang.org/cl/50900043

11 years agoA+C: Luke Curley (individual CLA)
Adam Langley [Fri, 17 Jan 2014 16:01:03 +0000 (11:01 -0500)]
A+C: Luke Curley (individual CLA)

Generated by addca.

R=gobot
CC=golang-codereviews
https://golang.org/cl/53710043

11 years agoruntime: add support for GOOS=solaris
Aram Hăvărneanu [Fri, 17 Jan 2014 04:58:10 +0000 (17:58 +1300)]
runtime: add support for GOOS=solaris

R=alex.brainman, dave, jsing, gobot, rsc
CC=golang-codereviews
https://golang.org/cl/35990043

11 years agonet/rpc: fix inconsistency in documentation of Service.Register
Rob Pike [Thu, 16 Jan 2014 23:57:32 +0000 (15:57 -0800)]
net/rpc: fix inconsistency in documentation of Service.Register
Falsely claimed an old, no longer true condition that the first argument
must be a pointer.
Fixes #6697

R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/53480043

11 years agonet: skip TestDualStackTCPListener in short mode
Dave Cheney [Thu, 16 Jan 2014 22:49:38 +0000 (09:49 +1100)]
net: skip TestDualStackTCPListener in short mode

Update #5001

This test is flakey on linux servers and fails otherwise good builds. Mikio has some proposals to fix the test, but they require additional plumbing.

In the meantime, disable this test in -short mode so it will run during the full net test suite, but not during builder ci.

R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/53410043

11 years agotime: break parse and formatting tests into a separate source file
Rob Pike [Thu, 16 Jan 2014 22:30:01 +0000 (14:30 -0800)]
time: break parse and formatting tests into a separate source file
No changes, just rearrangement. The tests were in need of a little
housekeeping.

R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/53400043

11 years agosyscall: add Flock_t on Linux
Brad Fitzpatrick [Thu, 16 Jan 2014 22:08:32 +0000 (14:08 -0800)]
syscall: add Flock_t on Linux

Matches Darwin and the BSDs. This means leveldb-go, kv,
Camlistore, etc can stop defining these structs on Linux by
hand.

Update #7059

R=golang-codereviews, dave, iant
CC=golang-codereviews
https://golang.org/cl/53350043

11 years agoreflect: Remove imprecise techniques from channel/select operations.
Keith Randall [Thu, 16 Jan 2014 21:35:29 +0000 (13:35 -0800)]
reflect: Remove imprecise techniques from channel/select operations.

Reflect used to communicate to the runtime using interface words,
which is bad for precise GC because sometimes iwords hold a pointer
and sometimes they don't.  This change rewrites channel and select
operations to always pass pointers to the runtime.

reflect.Select gets somewhat more expensive, as we now do an allocation
per receive case instead of one allocation whose size is the max of
all the received types.  This seems unavoidable to get preciseness
(unless we move the allocation into selectgo, which is a much bigger
change).

Fixes #6490

R=golang-codereviews, dvyukov, rsc
CC=golang-codereviews
https://golang.org/cl/52900043

11 years agonet/http: don't allow Content-Type or body on 204 and 1xx
Brad Fitzpatrick [Thu, 16 Jan 2014 19:43:52 +0000 (11:43 -0800)]
net/http: don't allow Content-Type or body on 204 and 1xx

Status codes 204, 304, and 1xx don't allow bodies. We already
had a function for this, but we were hard-coding just 304
(StatusNotModified) in a few places.  Use the function
instead, and flesh out tests for all codes.

Fixes #6685

R=golang-codereviews, r
CC=golang-codereviews
https://golang.org/cl/53290044

11 years agonet/smtp: add examples
Kamil Kisiel [Thu, 16 Jan 2014 18:49:58 +0000 (10:49 -0800)]
net/smtp: add examples

R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/8274046

11 years agonet/http: cache transport environment lookup
Brad Fitzpatrick [Thu, 16 Jan 2014 18:25:45 +0000 (10:25 -0800)]
net/http: cache transport environment lookup

Apparently this is expensive on Windows.

Fixes #7020

R=golang-codereviews, alex.brainman, mattn.jp, dvyukov
CC=golang-codereviews
https://golang.org/cl/52840043

11 years agofmt: fix bug printing large zero-padded hexadecimal
Rob Pike [Thu, 16 Jan 2014 17:48:23 +0000 (09:48 -0800)]
fmt: fix bug printing large zero-padded hexadecimal
We forgot to include the width of "0x" when computing the crossover
from internal buffer to allocated buffer.
Also add a helper function to the test for formatting large zero-padded
test strings.

Fixes #6777.

R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/50820043

11 years agocmd/gc: handle non-escaping address-taken variables better
Russ Cox [Thu, 16 Jan 2014 15:32:30 +0000 (10:32 -0500)]
cmd/gc: handle non-escaping address-taken variables better

This CL makes the bitmaps a little more precise about variables
that have their address taken but for which the address does not
escape to the heap, so that the variables are kept in the stack frame
rather than allocated on the heap.

The code before this CL handled these variables by treating every
return statement as using every such variable and depending on
liveness analysis to essentially treat the variable as live during the
entire function. That approach has false positives and (worse) false
negatives. That is, it's both sloppy and buggy:

        func f(b1, b2 bool) { // x live here! (sloppy)
                if b2 {
                        print(0) // x live here! (sloppy)
                        return
                }
                var z **int
                x := new(int)
                *x = 42
                z = &x
                print(**z) // x live here (conservative)
                if b2 {
                        print(1) // x live here (conservative)
                        return
                }
                for {
                        print(**z) // x not live here (buggy)
                }
        }

The first two liveness annotations (marked sloppy) are clearly
wrong: x cannot be live if it has not yet been declared.

The last liveness annotation (marked buggy) is also wrong:
x is live here as *z, but because there is no return statement
reachable from this point in the code, the analysis treats x as dead.

This CL changes the liveness calculation to mark such variables
live exactly at points in the code reachable from the variable
declaration. This keeps the conservative decisions but fixes
the sloppy and buggy ones.

The CL also detects ambiguously live variables, those that are
being marked live but may not actually have been initialized,
such as in this example:

        func f(b1 bool) {
                var z **int
                if b1 {
                        x := new(int)
                        *x = 42
                        z = &x
                } else {
                        y := new(int)
                        *y = 54
                        z = &y
                }
                print(**z) // x, y live here (conservative)
        }

Since the print statement is reachable from the declaration of x,
x must conservatively be marked live. The same goes for y.
Although both x and y are marked live at the print statement,
clearly only one of them has been initialized. They are both
"ambiguously live".

These ambiguously live variables cause problems for garbage
collection: the collector cannot ignore them but also cannot
depend on them to be initialized to valid pointer values.

Ambiguously live variables do not come up too often in real code,
but recent changes to the way map and interface runtime functions
are invoked has created a large number of ambiguously live
compiler-generated temporary variables. The next CL will adjust
the analysis to understand these temporaries better, to make
ambiguously live variables fairly rare.

Once ambiguously live variables are rare enough, another CL will
introduce code at the beginning of a function to zero those
slots on the stack. At that point the garbage collector and the
stack copying routines will be able to depend on the guarantee that
if a slot is marked as live in a liveness bitmap, it is initialized.

R=khr
CC=golang-codereviews, iant
https://golang.org/cl/51810043

11 years agocmd/gc: fix race build
Russ Cox [Thu, 16 Jan 2014 15:11:06 +0000 (10:11 -0500)]
cmd/gc: fix race build

Missed this case in CL 51010045.

TBR=khr
CC=golang-codereviews
https://golang.org/cl/53200043

11 years agoruntime: output how long goroutines are blocked
Dmitriy Vyukov [Thu, 16 Jan 2014 08:54:46 +0000 (12:54 +0400)]
runtime: output how long goroutines are blocked
Example of output:

goroutine 4 [sleep for 3 min]:
time.Sleep(0x34630b8a000)
        src/pkg/runtime/time.goc:31 +0x31
main.func·002()
        block.go:16 +0x2c
created by main.main
        block.go:17 +0x33

Full program and output are here:
http://play.golang.org/p/NEZdADI3Td

Fixes #6809.

R=golang-codereviews, khr, kamil.kisiel, bradfitz, rsc
CC=golang-codereviews
https://golang.org/cl/50420043

11 years agoruntime: use lock-free ring for work queues
Dmitriy Vyukov [Thu, 16 Jan 2014 08:17:00 +0000 (12:17 +0400)]
runtime: use lock-free ring for work queues
Use lock-free fixed-size ring for work queues
instead of an unbounded mutex-protected array.
The ring has single producer and multiple consumers.
If the ring overflows, work is put onto global queue.

benchmark              old ns/op    new ns/op    delta
BenchmarkMatmult               7            5  -18.12%
BenchmarkMatmult-4             2            2  -18.98%
BenchmarkMatmult-16            1            0  -12.84%

BenchmarkCreateGoroutines                     105           88  -16.10%
BenchmarkCreateGoroutines-4                   376          219  -41.76%
BenchmarkCreateGoroutines-16                  241          174  -27.80%
BenchmarkCreateGoroutinesParallel             103           87  -14.66%
BenchmarkCreateGoroutinesParallel-4           169          143  -15.38%
BenchmarkCreateGoroutinesParallel-16          158          151   -4.43%

R=golang-codereviews, rsc
CC=ddetlefs, devon.odell, golang-codereviews
https://golang.org/cl/46170044

11 years agoreflect: add precise GC info for Call argument frame.
Keith Randall [Wed, 15 Jan 2014 21:56:59 +0000 (13:56 -0800)]
reflect: add precise GC info for Call argument frame.

Give proper types to the argument/return areas
allocated for reflect calls.  Avoid use of iword to
manipulate receivers, which may or may not be pointers.

Update #6490

R=rsc
CC=golang-codereviews
https://golang.org/cl/52110044

11 years agonet/http: add disabled test for Body Read/Close lock granularity
Brad Fitzpatrick [Wed, 15 Jan 2014 21:12:32 +0000 (13:12 -0800)]
net/http: add disabled test for Body Read/Close lock granularity

Update #7121

R=golang-codereviews, gobot, dsymonds
CC=golang-codereviews
https://golang.org/cl/51750044

11 years agogo/scanner: report too short escape sequences
Robert Griesemer [Wed, 15 Jan 2014 17:50:55 +0000 (09:50 -0800)]
go/scanner: report too short escape sequences

Generally improve error messages for escape sequences.

R=adonovan
CC=golang-codereviews
https://golang.org/cl/49430046

11 years agocmd/pack: rewrite in Go
Rob Pike [Wed, 15 Jan 2014 17:13:52 +0000 (09:13 -0800)]
cmd/pack: rewrite in Go
Replace the pack command, a C program, with a clean reimplementation in Go.
It does not need to reproduce the full feature set and it is no longer used by
the build chain, but has a role in looking inside archives created by the build
chain directly.

Since it's not in C, it is no longer build by dist, so remove it from cmd/dist and
make it a "tool" in cmd/go terminology.

Fixes #2705

R=rsc, dave, minux.ma, josharian
CC=golang-codereviews
https://golang.org/cl/52310044

11 years agoruntime: fix data race in GC
Dmitriy Vyukov [Wed, 15 Jan 2014 15:38:08 +0000 (19:38 +0400)]
runtime: fix data race in GC
Fixes #5139.
Update #7065.

R=golang-codereviews, bradfitz, minux.ma
CC=golang-codereviews
https://golang.org/cl/52090045

11 years agonet/http: return UnexpectedEOF instead of EOF on truncated resposne
Brad Fitzpatrick [Wed, 15 Jan 2014 03:08:40 +0000 (19:08 -0800)]
net/http: return UnexpectedEOF instead of EOF on truncated resposne

Fixes #6564

R=golang-codereviews, r
CC=golang-codereviews
https://golang.org/cl/52420043

11 years agoruntime/debug: force GC after setting of GCPercent to make it effective.
Shenghou Ma [Wed, 15 Jan 2014 00:23:36 +0000 (19:23 -0500)]
runtime/debug: force GC after setting of GCPercent to make it effective.
See also discussion in CL 51010045.

R=golang-codereviews, r
CC=golang-codereviews
https://golang.org/cl/52230043

11 years agocmd/ld: document the -w flag, which disables DWARF generation
Rob Pike [Tue, 14 Jan 2014 23:34:27 +0000 (15:34 -0800)]
cmd/ld: document the -w flag, which disables DWARF generation

R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/52360044

11 years agospec: tighten the wording around . imports
Rob Pike [Tue, 14 Jan 2014 23:16:01 +0000 (15:16 -0800)]
spec: tighten the wording around . imports
Make it clear that if you do a . import, you cannot use a qualified identifier.

R=gri
CC=golang-codereviews
https://golang.org/cl/52390043

11 years agoreflect: better document the tri-state for TryRecv
Rob Pike [Tue, 14 Jan 2014 23:04:16 +0000 (15:04 -0800)]
reflect: better document the tri-state for TryRecv

R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/52360043

11 years agoruntime: Change size of map iter offset so 32-bit version compiles cleanly.
Keith Randall [Tue, 14 Jan 2014 21:46:22 +0000 (13:46 -0800)]
runtime: Change size of map iter offset so 32-bit version compiles cleanly.

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/52310043

11 years agonet/http: escape contents of the directory indexes generated by FileServer
Michael Kelly [Tue, 14 Jan 2014 20:55:12 +0000 (12:55 -0800)]
net/http: escape contents of the directory indexes generated by FileServer

      Previously, filenames containing special characters could:
      1) Escape the <a> tag, with a file called something like: ">foo
      2) Break the links in the index by prematurely ending the path portion
      of the url, with a file called: foo?bar

      In order to avoid a forbidden dependency on the html package, I'm
      using htmlReplacer from net/http/server.go, which is equivalent to
      html.EscapeString.

      This change also expands fakeFile.Readdir to better emulate
os.File.Readdir.

R=golang-codereviews, rsc, gobot, bradfitz, josharian, mikioh.mikioh
CC=golang-codereviews
https://golang.org/cl/37440043

11 years agoruntime: change map iteration randomization to use intra-bucket offset
Josh Bleecher Snyder [Tue, 14 Jan 2014 20:54:05 +0000 (12:54 -0800)]
runtime: change map iteration randomization to use intra-bucket offset

Map iteration previously started from a random bucket, but walked each
bucket from the beginning. Now, iteration always starts from the first
bucket and walks each bucket starting at a random offset. For
performance, the random offset is selected at the start of iteration
and reused for each bucket.

Iteration over a map with 8 or fewer elements--a single bucket--will
now be non-deterministic. There will now be only 8 different possible
map iterations.

Significant benchmark changes, on my OS X laptop (rough but consistent):

benchmark                              old ns/op     new ns/op     delta
BenchmarkMapIter                       128           121           -5.47%
BenchmarkMapIterEmpty                  4.26          4.45          +4.46%
BenchmarkNewEmptyMap                   114           111           -2.63%

Fixes #6719.

R=khr, bradfitz
CC=golang-codereviews
https://golang.org/cl/47370043

11 years agoundo CL 47560044 / 40a37153a550
Brad Fitzpatrick [Tue, 14 Jan 2014 20:53:21 +0000 (12:53 -0800)]
undo CL 47560044 / 40a37153a550

Still work to do. See http://golang.org/issue/7125

««« original CL description
net/http/cookiejar: document format of domain in PublicSuffix

Document what values a PublicSuffixList must accept as
a domain in a call to PublicSuffix.

R=bradfitz, nigeltao
CC=golang-codereviews
https://golang.org/cl/47560044

»»»

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/51770044

11 years agoC: add Michael Kelly (Google CLA)
Brad Fitzpatrick [Tue, 14 Jan 2014 20:53:06 +0000 (12:53 -0800)]
C: add Michael Kelly (Google CLA)

R=golang-codereviews, iant, mjk
CC=golang-codereviews
https://golang.org/cl/52220043

11 years agodoc: add cmd/gofmt entry to go1.3.txt
Brad Fitzpatrick [Tue, 14 Jan 2014 20:27:51 +0000 (12:27 -0800)]
doc: add cmd/gofmt entry to go1.3.txt

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/52240043

11 years agocmd/gofmt: remove -tabwidth and -tabs flags
Brad Fitzpatrick [Tue, 14 Jan 2014 19:10:56 +0000 (11:10 -0800)]
cmd/gofmt: remove -tabwidth and -tabs flags

Having these flags misleads people into thinking they're acceptable
for code that "must be gofmt'd".

If an organization wishes to use gofmt internally with
different settings, they can fork gofmt trivially. But "gofmt"
as used by the community with open source Go code should not
support these old knobs.

Also removes the -comments flag.

Fixes #7101

R=r, gri
CC=golang-codereviews
https://golang.org/cl/52170043

11 years agoapi: update next.txt
Brad Fitzpatrick [Tue, 14 Jan 2014 18:18:43 +0000 (10:18 -0800)]
api: update next.txt

Now with more syscall!

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/52150043

11 years agonet/http: fix another data race when sharing Request.Body
Brad Fitzpatrick [Tue, 14 Jan 2014 17:46:40 +0000 (09:46 -0800)]
net/http: fix another data race when sharing Request.Body

Fix another issue (similar to Issue 6995) where there was a
data race when sharing a server handler's Request.Body with
another goroutine that out-lived the Handler's goroutine.

In some cases we were not closing the incoming Request.Body
(which would've required reading it until the end) if we
thought it we thought we were going to be forcibly closing the
underlying net.Conn later anyway. But that optimization
largely moved to the transfer.go *body later, and locking was
added to *body which then detected read-after-close, so now
calling the (*body).Close always is both cheap and correct.

No new test because TestTransportAndServerSharedBodyRace caught it,
albeit only sometimes. Running:

while ./http.test -test.cpu=8 -test.run=TestTransportAndServerSharedBodyRace; do true; done

... would reliably cause a race before, but not now.

Update #6995
Fixes #7092

R=golang-codereviews, khr
CC=golang-codereviews
https://golang.org/cl/51700043

11 years agocmd/gc: return canonical Node* from temp
Russ Cox [Tue, 14 Jan 2014 15:43:13 +0000 (10:43 -0500)]
cmd/gc: return canonical Node* from temp

For historical reasons, temp was returning a copy
of the created Node*, not the original Node*.
This meant that if analysis recorded information in the
returned node (for example, n->addrtaken = 1), the
analysis would not show up on the original Node*, the
one kept in fn->dcl and consulted during liveness
bitmap creation.

Correct this, and watch for it when setting addrtaken.

Fixes #7083.

R=khr, dave, minux.ma
CC=golang-codereviews
https://golang.org/cl/51010045

11 years agocmd/gc: add -live flag for debugging liveness maps
Russ Cox [Tue, 14 Jan 2014 15:40:16 +0000 (10:40 -0500)]
cmd/gc: add -live flag for debugging liveness maps

R=khr
CC=golang-codereviews
https://golang.org/cl/51820043

11 years agoruntime: emit collection stacks in GODEBUG=allocfreetrace mode
Russ Cox [Tue, 14 Jan 2014 15:39:50 +0000 (10:39 -0500)]
runtime: emit collection stacks in GODEBUG=allocfreetrace mode

R=khr, dvyukov
CC=golang-codereviews
https://golang.org/cl/51830043

11 years agoruntime: fix comment
Dmitriy Vyukov [Tue, 14 Jan 2014 08:58:13 +0000 (12:58 +0400)]
runtime: fix comment
Void function can not return false.

R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/52000043

11 years agocmd/api: ensure GOPATH always points to the correct go.tools
Alex Brainman [Tue, 14 Jan 2014 05:56:22 +0000 (16:56 +1100)]
cmd/api: ensure GOPATH always points to the correct go.tools

R=golang-codereviews, dave, bradfitz
CC=golang-codereviews
https://golang.org/cl/51000043

11 years agoruntime/pprof: fix flaky TestCPUProfileMultithreaded test
Keith Randall [Tue, 14 Jan 2014 05:18:47 +0000 (21:18 -0800)]
runtime/pprof: fix flaky TestCPUProfileMultithreaded test

It's too sensitive.

Fixes bug 7095

R=golang-codereviews, iant, minux.ma, rsc
CC=golang-codereviews
https://golang.org/cl/50470043

11 years agocmd/link: fix build
Russ Cox [Tue, 14 Jan 2014 04:20:53 +0000 (23:20 -0500)]
cmd/link: fix build

The golden file for link.hello.darwin.amd64
was a little ahead of the checked-in code.

R=iant
TBR=iant
CC=golang-codereviews
https://golang.org/cl/51870043

11 years agocmd/link: implement dead code removal
Russ Cox [Tue, 14 Jan 2014 04:08:10 +0000 (23:08 -0500)]
cmd/link: implement dead code removal

R=iant
CC=golang-codereviews
https://golang.org/cl/51470043

11 years agocmd/link: implement and test automatic symbols
Russ Cox [Tue, 14 Jan 2014 04:07:57 +0000 (23:07 -0500)]
cmd/link: implement and test automatic symbols

Related changes included in this CL:

 - Add explicit start symbol to Prog.
 - Add omitRuntime bool to Prog.
 - Introduce p.Packages[""] to hold automatic symbols
 - Add SymOrder to Prog to preserve symbol order.
 - Add layout test (and fix bug that was putting everything in text section).

R=iant
CC=golang-codereviews
https://golang.org/cl/51260045

11 years agocmd/link: replace golden binary files with hex dumps
Russ Cox [Tue, 14 Jan 2014 04:07:40 +0000 (23:07 -0500)]
cmd/link: replace golden binary files with hex dumps

The hex dumps will diff better, and I hope they will avoid
a repeat of http://bugs.debian.org/716853.

The CL will probably show the testdata diffs as "binary",
but in fact the binary versions are being replaced by
textual hex dumps (output of hexdump -C).

R=iant
CC=golang-codereviews
https://golang.org/cl/51000044

11 years agonet: fix incorrect internal IPv6 address representation in test
Mikio Hara [Mon, 13 Jan 2014 22:36:38 +0000 (07:36 +0900)]
net: fix incorrect internal IPv6 address representation in test

Also fixes a dialgoogle test glitch after issue 6628 fix.

R=golang-codereviews, r
CC=golang-codereviews
https://golang.org/cl/50660044

11 years agoos/exec: disable fd check in TestHelperProcess on Plan 9
David du Colombier [Mon, 13 Jan 2014 22:03:22 +0000 (23:03 +0100)]
os/exec: disable fd check in TestHelperProcess on Plan 9

On Plan 9, we can observe the following open file descriptors:

  0 r  c    0 (000000000000000a   0 00)     0        0 /dev/null
  1 rw |    0 (0000000001df6742   0 00) 65536       54 #|/data1
  2 rw |    0 (0000000001df6782   0 00) 65536        0 #|/data1
  3 rw M 1956 (0000000000d66dd2   0 00)  8192       12 /tmp/333163398
  4 r  c    0 (0000000000000001   0 00)     0      528 /dev/bintime
  5 r  M 1956 (0000000000d66dd1 854 00)  8192        0 /tmp/go-build843954301/os/exec/_test/exec.test
  6 r  M 1956 (0000000000d66dd1 854 00)  8192        0 /tmp/go-build843954301/os/exec/_test/exec.test
  7 r  M 1956 (0000000000d66dd1 854 00)  8192        0 /tmp/go-build843954301/os/exec/_test/exec.test
  8 r  M 1956 (0000000000d66dd1 854 00)  8192        0 /tmp/go-build843954301/os/exec/_test/exec.test
  9 r  M 1956 (0000000000d66dd1 854 00)  8192        0 /tmp/go-build843954301/os/exec/_test/exec.test
 10 r  M 1956 (0000000000d66dd1 854 00)  8192        0 /tmp/go-build843954301/os/exec/_test/exec.test
 11 r  c    0 (000000000000000f   0 00)     0       32 /dev/random
 12 r  M 1956 (0000000000d66dd1 854 00)  8192        0 /tmp/go-build843954301/os/exec/_test/exec.test
 13 r  c    0 (000000000000000a   0 00)     0        0 /dev/null
 14 rw |    0 (0000000001df6801   0 00) 65536        0 #|/data
 15 rw |    0 (0000000001df6802   0 00) 65536     1275 #|/data1

R=rsc, bradfitz, aram
CC=golang-codereviews
https://golang.org/cl/51420044

11 years agosyscall: add syscall.Termios on freebsd/{386,amd64}
Michael Gehring [Mon, 13 Jan 2014 21:57:38 +0000 (13:57 -0800)]
syscall: add syscall.Termios on freebsd/{386,amd64}

R=golang-codereviews, bradfitz, mg
CC=golang-codereviews
https://golang.org/cl/51580044

11 years agoC+A: add email alias for Michael Gehring
Brad Fitzpatrick [Mon, 13 Jan 2014 21:57:06 +0000 (13:57 -0800)]
C+A: add email alias for Michael Gehring

R=golang-codereviews, gnirheg.leahcim
CC=golang-codereviews
https://golang.org/cl/51670043

11 years agonet/http: clarify semantics of File methods
Brad Fitzpatrick [Mon, 13 Jan 2014 21:52:06 +0000 (13:52 -0800)]
net/http: clarify semantics of File methods

There were no docs explaining the meaning of Readdir's count
argument, for instance. Clarify that these mean the same as
the methods on *os.File.

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/51630043

11 years agogo/scanner: minimal non-terminated literals
Robert Griesemer [Mon, 13 Jan 2014 19:10:45 +0000 (11:10 -0800)]
go/scanner: minimal non-terminated literals

Consume as little as possible input when encountering
non-terminated rune, string, and raw string literals.
The old code consumed at least one extra character
which could lead to worse error recovery when parsing
erroneous sources.

Also made error messages in those cases more consistent.

Fixes #7091.

R=adonovan
CC=golang-codereviews
https://golang.org/cl/50630043

11 years agoruntime: remove redundant 0x prefix in error print
Russ Cox [Mon, 13 Jan 2014 16:39:04 +0000 (11:39 -0500)]
runtime: remove redundant 0x prefix in error print

%x already adds the prefix unconditionally

R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/51550043

11 years agoos: disable TestReaddirStatFailures on Plan 9
David du Colombier [Mon, 13 Jan 2014 12:24:59 +0000 (13:24 +0100)]
os: disable TestReaddirStatFailures on Plan 9

R=rsc, dave, aram, jeremyjackins, lucio.dere
CC=golang-codereviews, jas
https://golang.org/cl/50980043

11 years agosyscall: include mmap constants in openbsd zerror* files
Joel Sing [Mon, 13 Jan 2014 00:25:48 +0000 (11:25 +1100)]
syscall: include mmap constants in openbsd zerror* files

Include the <sys/mman.h> header for OpenBSD mkerrors.sh. This brings
in constants used with madvise(2), mmap(2), msync(2) and mlockall(2).

Fixes #4929

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/50930043

11 years agosyscall: remove getsockname workaround for openbsd
Joel Sing [Mon, 13 Jan 2014 00:24:56 +0000 (11:24 +1100)]
syscall: remove getsockname workaround for openbsd

Remove the getsockname workaround for unix domain sockets on OpenBSD.
This was fixed in OpenBSD 5.2 and we now have a minimum requirement
for OpenBSD 5.4-current.

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/50960043

11 years agoruntime/pprof: enable profiling test on openbsd
Joel Sing [Mon, 13 Jan 2014 00:24:08 +0000 (11:24 +1100)]
runtime/pprof: enable profiling test on openbsd

Profiling of multithreaded applications works correctly on OpenBSD
5.4-current, so enable the profiling test.

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/50940043

11 years agonet: ignore some errors in windows Accept
Alex Brainman [Sun, 12 Jan 2014 01:20:16 +0000 (12:20 +1100)]
net: ignore some errors in windows Accept

Fixes #6987

R=golang-codereviews, dvyukov
CC=golang-codereviews
https://golang.org/cl/49490043

11 years agonet: add plan9 to TestDialTimeout
Jeff Sickel [Sat, 11 Jan 2014 17:58:03 +0000 (18:58 +0100)]
net: add plan9 to TestDialTimeout
     === RUN TestDialTimeout
     --- PASS: TestDialTimeout (0.21 seconds)

R=golang-codereviews, bradfitz, 0intro
CC=golang-codereviews, rsc
https://golang.org/cl/49710050

11 years agoapi: update except.txt and next.txt to reflect openbsd system ABI break
Joel Sing [Sat, 11 Jan 2014 09:16:39 +0000 (20:16 +1100)]
api: update except.txt and next.txt to reflect openbsd system ABI break

Update #7049

R=golang-codereviews, minux.ma, mikioh.mikioh
CC=golang-codereviews
https://golang.org/cl/49470052

11 years agoruntime, syscall: update for openbsd system ABI break
Joel Sing [Sat, 11 Jan 2014 08:00:32 +0000 (19:00 +1100)]
runtime, syscall: update for openbsd system ABI break

Update Go so that it continues to work past the OpenBSD system ABI
break, with 64-bit time_t:

  http://www.openbsd.org/faq/current.html#20130813

Note: this makes OpenBSD 5.5 (currently 5.4-current) the minimum
supported release for Go.

Fixes #7049.

R=golang-codereviews, mikioh.mikioh
CC=golang-codereviews
https://golang.org/cl/13368046

11 years agodatabase/sql: fix test on 32-bit
Brad Fitzpatrick [Fri, 10 Jan 2014 20:30:23 +0000 (12:30 -0800)]
database/sql: fix test on 32-bit

R=golang-codereviews
TBR=golang-dev
CC=golang-codereviews
https://golang.org/cl/49920047

11 years agodatabase/sql: avoiding fmt.Sprintf while scanning, avoid allocs with RawBytes
Brad Fitzpatrick [Fri, 10 Jan 2014 20:19:36 +0000 (12:19 -0800)]
database/sql: avoiding fmt.Sprintf while scanning, avoid allocs with RawBytes

A user reported heavy contention on fmt's printer cache. Avoid
fmt.Sprint. We have to do reflection anyway, and there was
already an asString function to use strconv, so use it.

This CL also eliminates a redundant allocation + copy when
scanning into *[]byte (avoiding the intermediate string)
and avoids an extra alloc when assigning to a caller's RawBytes
(trying to reuse the caller's memory).

Fixes #7086

R=golang-codereviews, nightlyone
CC=golang-codereviews
https://golang.org/cl/50240044

11 years agoA+C: Gautham Thambidorai (individual CLA)
Adam Langley [Fri, 10 Jan 2014 18:46:42 +0000 (13:46 -0500)]
A+C: Gautham Thambidorai (individual CLA)

Generated by addca.

R=gobot
CC=golang-codereviews
https://golang.org/cl/50500043

11 years agofmt: make benchmarks parallel
Dmitriy Vyukov [Fri, 10 Jan 2014 09:51:11 +0000 (13:51 +0400)]
fmt: make benchmarks parallel
This seems to be the best target to benchmark sync.Pool changes.

This is resend of cl/49910043 which was LGTMed by
TBR=bradfitz

R=golang-codereviews
CC=golang-codereviews
https://golang.org/cl/50140045

11 years agoliblink: fix comments. Someone was overzealous with search & replace.
Keith Randall [Fri, 10 Jan 2014 03:46:46 +0000 (19:46 -0800)]
liblink: fix comments.  Someone was overzealous with search & replace.

R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/49160045

11 years agonet: add SetKeepAlivePeriod for windows
Nicholas Katsaros [Fri, 10 Jan 2014 03:33:54 +0000 (14:33 +1100)]
net: add SetKeepAlivePeriod for windows

R=golang-codereviews, alex.brainman, bradfitz, mikioh.mikioh
CC=golang-codereviews
https://golang.org/cl/11393043

11 years agoliblink: adjust format verbs to avoid collisions
Anthony Martin [Fri, 10 Jan 2014 03:01:08 +0000 (19:01 -0800)]
liblink: adjust format verbs to avoid collisions

The %S and %N format verbs are used by cmd/gc to
represent Sym and Node structures, respectively.

In liblink, these two verbs are used only by the %D
format routine and never referenced externally.

This change will allow us to delete the duplicated
code for the %A, %D, %P, and %R format routines in
both the compiler and linker.

R=golang-codereviews, rsc
CC=golang-codereviews
https://golang.org/cl/49720043

11 years agocmd/gc: mark OGOTO as a statement for formatters.
Rémy Oudompheng [Fri, 10 Jan 2014 00:33:24 +0000 (01:33 +0100)]
cmd/gc: mark OGOTO as a statement for formatters.

Nodes of goto statements were corrupted when written
to export data.

Fixes #7023.

R=rsc, dave, minux.ma
CC=golang-codereviews
https://golang.org/cl/46190043

11 years agocmd/link: Mach-O (OS X) file formatter
Russ Cox [Fri, 10 Jan 2014 00:29:29 +0000 (19:29 -0500)]
cmd/link: Mach-O (OS X) file formatter

See CL 48870044 for basic structure.

R=iant
CC=golang-codereviews
https://golang.org/cl/48910043

11 years agocmd/link: intial skeleton of linker written in Go
Russ Cox [Fri, 10 Jan 2014 00:29:10 +0000 (19:29 -0500)]
cmd/link: intial skeleton of linker written in Go

R=iant
CC=golang-codereviews
https://golang.org/cl/48870044

11 years agonet/http: use TCP keep-alives for ListenAndServe and ListenAndServeTLS
Brad Fitzpatrick [Thu, 9 Jan 2014 23:05:09 +0000 (15:05 -0800)]
net/http: use TCP keep-alives for ListenAndServe and ListenAndServeTLS

Our default behavior for the common cases shouldn't lead to
leaked TCP connections (e.g. from people closing laptops) when
their Go servers are exposed to the open Internet without a
proxy in front.

Too many users on golang-nuts have learned this the hard way.

No API change. Only ListenAndServe and ListenAndServeTLS are
updated.

R=golang-codereviews, cespare, gobot, rsc, minux.ma
CC=golang-codereviews
https://golang.org/cl/48300043

11 years agoruntime: fix 32-bit malloc for pointers >= 0x80000000
Ian Lance Taylor [Thu, 9 Jan 2014 23:00:00 +0000 (15:00 -0800)]
runtime: fix 32-bit malloc for pointers >= 0x80000000

The spans array is allocated in runtime·mallocinit.  On a
32-bit system the number of entries in the spans array is
MaxArena32 / PageSize, which (2U << 30) / (1 << 12) == (1 << 19).
So we are allocating an array that can hold 19 bits for an
index that can hold 20 bits.  According to the comment in the
function, this is intentional: we only allocate enough spans
(and bitmaps) for a 2G arena, because allocating more would
probably be wasteful.

But since the span index is simply the upper 20 bits of the
memory address, this scheme only works if memory addresses are
limited to the low 2G of memory.  That would be OK if we were
careful to enforce it, but we're not.  What we are careful to
enforce, in functions like runtime·MHeap_SysAlloc, is that we
always return addresses between the heap's arena_start and
arena_start + MaxArena32.

We generally get away with it because we start allocating just
after the program end, so we only run into trouble with
programs that allocate a lot of memory, enough to get past
address 0x80000000.

This changes the code that computes a span index to subtract
arena_start on 32-bit systems just as we currently do on
64-bit systems.

R=golang-codereviews, rsc
CC=golang-codereviews
https://golang.org/cl/49460043

11 years agogo/parser: slightly improved error message by adding hint
Robert Griesemer [Thu, 9 Jan 2014 22:51:23 +0000 (14:51 -0800)]
go/parser: slightly improved error message by adding hint

It's difficult to make this much better w/o much
more effort. This is a rare case and probably not
worth it.

Fixes #6052.

R=golang-codereviews, bradfitz, adonovan
CC=golang-codereviews
https://golang.org/cl/49740045

11 years agoapi: update next.txt
Brad Fitzpatrick [Thu, 9 Jan 2014 22:31:10 +0000 (14:31 -0800)]
api: update next.txt

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/50190043

11 years agotesting: document that ResetTimer also zeros the allocation counters.
Shenghou Ma [Thu, 9 Jan 2014 20:21:24 +0000 (15:21 -0500)]
testing: document that ResetTimer also zeros the allocation counters.
Fixes #6998.

R=golang-codereviews, gobot, r
CC=golang-codereviews
https://golang.org/cl/44880044

11 years agocrypto/tls: support renegotiation extension.
Adam Langley [Thu, 9 Jan 2014 18:38:11 +0000 (13:38 -0500)]
crypto/tls: support renegotiation extension.

The renegotiation extension was introduced[1] due to an attack by Ray in
which a client's handshake was spliced into a connection that was
renegotiating, thus giving an attacker the ability to inject an
arbitary prefix into the connection.

Go has never supported renegotiation as a server and so this attack
doesn't apply. As a client, it's possible that at some point in the
future the population of servers will be sufficiently updated that
it'll be possible to reject connections where the server hasn't
demonstrated that it has been updated to address this problem.

We're not at that point yet, but it's good for Go servers to support
the extension so that it might be possible to do in the future.

[1] https://tools.ietf.org/search/rfc5746

R=golang-codereviews, mikioh.mikioh
CC=golang-codereviews
https://golang.org/cl/48580043

11 years agoA+C: Nicholas Katsaros (individual CLA)
Brad Fitzpatrick [Thu, 9 Jan 2014 17:42:58 +0000 (09:42 -0800)]
A+C: Nicholas Katsaros (individual CLA)

Generated by addca.

R=gobot
CC=golang-codereviews
https://golang.org/cl/49950043

11 years agoruntime: co-exist with NPTL's pthread_cancel.
Rowan Worth [Thu, 9 Jan 2014 17:34:04 +0000 (09:34 -0800)]
runtime: co-exist with NPTL's pthread_cancel.

NPTL uses SIGRTMIN (signal 32) to effect thread cancellation.
Go's runtime replaces NPTL's signal handler with its own, and
ends up aborting if a C library that ends up calling
pthread_cancel is used.

This patch prevents runtime from replacing NPTL's handler.

Fixes #6997.

R=golang-codereviews, iant, dvyukov
CC=golang-codereviews
https://golang.org/cl/47540043

11 years agoA+C: sqweek (individual CLA)
Ian Lance Taylor [Thu, 9 Jan 2014 17:33:35 +0000 (09:33 -0800)]
A+C: sqweek (individual CLA)

Generated by addca.

R=gobot
CC=golang-codereviews
https://golang.org/cl/49940043

11 years agoos, os/exec, os/user: add support for GOOS=solaris
Aram Hăvărneanu [Thu, 9 Jan 2014 15:49:37 +0000 (02:49 +1100)]
os, os/exec, os/user: add support for GOOS=solaris

R=golang-codereviews, dave, minux.ma, gobot, jsing
CC=golang-codereviews
https://golang.org/cl/36020043

11 years agoruntime: change errorCString to a struct
Ian Lance Taylor [Thu, 9 Jan 2014 05:40:33 +0000 (21:40 -0800)]
runtime: change errorCString to a struct

This prevents callers from using reflect to create a new
instance of errorCString with an arbitrary value and calling
the Error method to examine arbitrary memory.

Fixes #7084.

R=golang-codereviews, minux.ma, bradfitz
CC=golang-codereviews
https://golang.org/cl/49600043

11 years agodebug/goobj: add String methods for SymID and SymKind
Russ Cox [Thu, 9 Jan 2014 01:37:41 +0000 (20:37 -0500)]
debug/goobj: add String methods for SymID and SymKind

R=iant
CC=golang-codereviews
https://golang.org/cl/48890044

11 years agolibmach: use different names for different Ureg types
Russ Cox [Thu, 9 Jan 2014 01:37:27 +0000 (20:37 -0500)]
libmach: use different names for different Ureg types

Everything was doing this already with #defines.
Do it right.

R=golang-codereviews, jsing, 0intro, iant
CC=golang-codereviews
https://golang.org/cl/49090043

11 years agocmd/nm: add -sort=size
Rob Pike [Wed, 8 Jan 2014 23:56:40 +0000 (15:56 -0800)]
cmd/nm: add -sort=size
When printing the size, we often want to sort on that key.
Because it's used when looking for large things, make the
sort go from largest to smallest.

Perfect recreation of CL 45150044, which was lost to some blunder.

R=golang-codereviews, gobot, rsc
CC=golang-codereviews
https://golang.org/cl/48500044

11 years ago libmach: use Go's ureg headers on Plan 9
David du Colombier [Wed, 8 Jan 2014 22:34:11 +0000 (23:34 +0100)]
libmach: use Go's ureg headers on Plan 9

    The CL 49090043 renamed Ureg structures to Ureg386,
    UregArm and UregAmd64. This broke build on Plan 9,
    since ureg_x86.h includes /386/include/ureg.h, which
    declares a structure named Ureg instead of Ureg386.

R=golang-codereviews, bradfitz
CC=golang-codereviews, rsc
https://golang.org/cl/49260043

11 years agoruntime: deallocate specials before deallocating the underlying object.
Keith Randall [Wed, 8 Jan 2014 20:41:26 +0000 (12:41 -0800)]
runtime: deallocate specials before deallocating the underlying object.

R=dvyukov
CC=golang-codereviews
https://golang.org/cl/48840043

11 years agoruntime: handle gdb breakpoint in x86 traceback
Ian Lance Taylor [Wed, 8 Jan 2014 20:36:31 +0000 (12:36 -0800)]
runtime: handle gdb breakpoint in x86 traceback

This lets stack splits work correctly when running under gdb
when gdb has inserted a breakpoint somewhere on the call
stack.

Fixes #6834.

R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/48650043

11 years agoplan9: lookup query must seek to offset 0 before reading or
Jeff Sickel [Wed, 8 Jan 2014 20:22:18 +0000 (21:22 +0100)]
plan9: lookup query must seek to offset 0 before reading or
       writing /net/dns or /net/cs (see nbd(8)).

R=golang-codereviews
CC=0intro, golang-codereviews, rsc
https://golang.org/cl/49060043

11 years agoarchive/zip: new test for earlier zip64 fix
Brad Fitzpatrick [Wed, 8 Jan 2014 19:28:40 +0000 (11:28 -0800)]
archive/zip: new test for earlier zip64 fix

Update #7069

R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/49180043

11 years agoall: add solaris build tags
Aram Hăvărneanu [Wed, 8 Jan 2014 04:53:30 +0000 (23:53 -0500)]
all: add solaris build tags

R=golang-codereviews, minux.ma, gobot, rsc, dave
CC=golang-codereviews
https://golang.org/cl/36040043

11 years agocmd/go: test: do not put object files where later steps will find them
Michael Hudson-Doyle [Wed, 8 Jan 2014 04:53:16 +0000 (23:53 -0500)]
cmd/go: test: do not put object files where later steps will find them

When recompiling a package whose basename is the name of a standard
package for testing with gccgo, a .o file with the basename of the
package being tested was being placed in the _test/ directory where the
compilation of the test binary then found it when looking for the
standard library package.

This change puts the object files in a separate directory.

Fixes #6793

R=golang-codereviews, dave, gobot, rsc, iant
CC=golang-codereviews
https://golang.org/cl/27650045

11 years agoruntime: use special records hung off the MSpan to
Keith Randall [Tue, 7 Jan 2014 21:45:50 +0000 (13:45 -0800)]
runtime: use special records hung off the MSpan to
record finalizers and heap profile info.  Enables
removing the special bit from the heap bitmap.  Also
provides a generic mechanism for annotating occasional
heap objects.

finalizers
        overhead      per obj
old 680 B       80 B avg
new 16 B/span     48 B

profile
        overhead      per obj
old 32KB       24 B + hash tables
new 16 B/span     24 B

R=cshapiro, khr, dvyukov, gobot
CC=golang-codereviews
https://golang.org/cl/13314053

11 years agonet/http: fix data race when sharing request body between client and server
Brad Fitzpatrick [Tue, 7 Jan 2014 18:40:56 +0000 (10:40 -0800)]
net/http: fix data race when sharing request body between client and server

A server Handler (e.g. a proxy) can receive a Request, and
then turn around and give a copy of that Request.Body out to
the Transport. So then two goroutines own that Request.Body
(the server and the http client), and both think they can
close it on failure.  Therefore, all incoming server requests
bodies (always *http.body from transfer.go) need to be
thread-safe.

Fixes #6995

R=golang-codereviews, r
CC=golang-codereviews
https://golang.org/cl/46570043

11 years agoencoding/csv: test that carriage return is handled in Write
Shawn Smith [Tue, 7 Jan 2014 17:32:15 +0000 (09:32 -0800)]
encoding/csv: test that carriage return is handled in Write

R=golang-codereviews, r
CC=golang-codereviews
https://golang.org/cl/46310043

11 years agocmd/gc: add missing dupok flag for interface method wrappers.
Rémy Oudompheng [Tue, 7 Jan 2014 17:25:11 +0000 (18:25 +0100)]
cmd/gc: add missing dupok flag for interface method wrappers.

R=rsc
CC=golang-codereviews
https://golang.org/cl/48420044

11 years agocrypto/sha512: avoid duplicate block declaration on 386
Joel Sing [Tue, 7 Jan 2014 12:50:31 +0000 (23:50 +1100)]
crypto/sha512: avoid duplicate block declaration on 386

Unbreak the build - we do not have a sha512 block implementation in
386 assembly (yet).

R=golang-codereviews, dave
CC=golang-codereviews
https://golang.org/cl/48520043

11 years agocmd/gc: do not omit wrapper for expression (interface{...}).F
Rémy Oudompheng [Tue, 7 Jan 2014 12:26:48 +0000 (13:26 +0100)]
cmd/gc: do not omit wrapper for expression (interface{...}).F

Fixes #6723.

R=rsc
CC=golang-codereviews
https://golang.org/cl/41570047

11 years agocrypto/sha512: block implementation in amd64 assembly
Joel Sing [Tue, 7 Jan 2014 12:16:46 +0000 (23:16 +1100)]
crypto/sha512: block implementation in amd64 assembly

Benchmark on Intel(R) Xeon(R) CPU X5650  @ 2.67GHz

benchmark              old ns/op    new ns/op    delta
BenchmarkHash8Bytes         1779         1114  -37.38%
BenchmarkHash1K             9848         4894  -50.30%
BenchmarkHash8K            68513        32187  -53.02%

benchmark               old MB/s     new MB/s  speedup
BenchmarkHash8Bytes         4.50         7.18    1.60x
BenchmarkHash1K           103.97       209.19    2.01x
BenchmarkHash8K           119.57       254.51    2.13x

R=agl
CC=golang-codereviews
https://golang.org/cl/37150044