Commit 9d12307a authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

ioutil: add Discard, update tree.

This also removes an unnecessary allocation in
http/transfer.go

R=r, rsc1, r2, adg
CC=golang-dev
https://golang.org/cl/4426066
parent ec3fe2a5
...@@ -112,12 +112,6 @@ func TestReader(t *testing.T) { ...@@ -112,12 +112,6 @@ func TestReader(t *testing.T) {
} }
} }
type devNull struct{}
func (devNull) Write(p []byte) (int, os.Error) {
return len(p), nil
}
func benchmarkDecoder(b *testing.B, n int) { func benchmarkDecoder(b *testing.B, n int) {
b.StopTimer() b.StopTimer()
b.SetBytes(int64(n)) b.SetBytes(int64(n))
...@@ -134,7 +128,7 @@ func benchmarkDecoder(b *testing.B, n int) { ...@@ -134,7 +128,7 @@ func benchmarkDecoder(b *testing.B, n int) {
runtime.GC() runtime.GC()
b.StartTimer() b.StartTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
io.Copy(devNull{}, NewReader(bytes.NewBuffer(buf1), LSB, 8)) io.Copy(ioutil.Discard, NewReader(bytes.NewBuffer(buf1), LSB, 8))
} }
} }
......
...@@ -113,7 +113,7 @@ func benchmarkEncoder(b *testing.B, n int) { ...@@ -113,7 +113,7 @@ func benchmarkEncoder(b *testing.B, n int) {
runtime.GC() runtime.GC()
b.StartTimer() b.StartTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
w := NewWriter(devNull{}, LSB, 8) w := NewWriter(ioutil.Discard, LSB, 8)
w.Write(buf1) w.Write(buf1)
w.Close() w.Close()
} }
......
...@@ -15,12 +15,6 @@ import ( ...@@ -15,12 +15,6 @@ import (
"testing" "testing"
) )
type devNull struct{}
func (devNull) Write(p []byte) (int, os.Error) {
return len(p), nil
}
func pipeErr(err os.Error) io.Reader { func pipeErr(err os.Error) io.Reader {
pr, pw := io.Pipe() pr, pw := io.Pipe()
pw.CloseWithError(err) pw.CloseWithError(err)
...@@ -141,7 +135,7 @@ func TestParser(t *testing.T) { ...@@ -141,7 +135,7 @@ func TestParser(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
// Skip the #error section. // Skip the #error section.
if _, err := io.Copy(devNull{}, <-rc); err != nil { if _, err := io.Copy(ioutil.Discard, <-rc); err != nil {
t.Fatal(err) t.Fatal(err)
} }
// Compare the parsed tree to the #document section. // Compare the parsed tree to the #document section.
......
...@@ -7,6 +7,7 @@ package http ...@@ -7,6 +7,7 @@ package http
import ( import (
"bufio" "bufio"
"io" "io"
"io/ioutil"
"os" "os"
"strconv" "strconv"
"strings" "strings"
...@@ -447,17 +448,10 @@ func (b *body) Close() os.Error { ...@@ -447,17 +448,10 @@ func (b *body) Close() os.Error {
return nil return nil
} }
trashBuf := make([]byte, 1024) // local for thread safety if _, err := io.Copy(ioutil.Discard, b); err != nil {
for {
_, err := b.Read(trashBuf)
if err == nil {
continue
}
if err == os.EOF {
break
}
return err return err
} }
if b.hdr == nil { // not reading trailer if b.hdr == nil { // not reading trailer
return nil return nil
} }
......
...@@ -101,3 +101,13 @@ func (nopCloser) Close() os.Error { return nil } ...@@ -101,3 +101,13 @@ func (nopCloser) Close() os.Error { return nil }
func NopCloser(r io.Reader) io.ReadCloser { func NopCloser(r io.Reader) io.ReadCloser {
return nopCloser{r} return nopCloser{r}
} }
type devNull int
func (devNull) Write(p []byte) (int, os.Error) {
return len(p), nil
}
// Discard is an io.Writer on which all Write calls succeed
// without doing anything.
var Discard io.Writer = devNull(0)
...@@ -16,6 +16,7 @@ import ( ...@@ -16,6 +16,7 @@ import (
"bufio" "bufio"
"bytes" "bytes"
"io" "io"
"io/ioutil"
"mime" "mime"
"net/textproto" "net/textproto"
"os" "os"
...@@ -76,14 +77,6 @@ func NewReader(reader io.Reader, boundary string) Reader { ...@@ -76,14 +77,6 @@ func NewReader(reader io.Reader, boundary string) Reader {
// Implementation .... // Implementation ....
type devNullWriter bool
func (*devNullWriter) Write(p []byte) (n int, err os.Error) {
return len(p), nil
}
var devNull = devNullWriter(false)
func newPart(mr *multiReader) (bp *Part, err os.Error) { func newPart(mr *multiReader) (bp *Part, err os.Error) {
bp = new(Part) bp = new(Part)
bp.Header = make(map[string][]string) bp.Header = make(map[string][]string)
...@@ -158,7 +151,7 @@ func (bp *Part) Read(p []byte) (n int, err os.Error) { ...@@ -158,7 +151,7 @@ func (bp *Part) Read(p []byte) (n int, err os.Error) {
} }
func (bp *Part) Close() os.Error { func (bp *Part) Close() os.Error {
io.Copy(&devNull, bp) io.Copy(ioutil.Discard, bp)
return nil return nil
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment