From afedc6a56863716f7d39b4296762d2045b017cd9 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 18 Jan 2012 16:24:06 -0800 Subject: [PATCH] net: change SetTimeout to SetDeadline Previously, a timeout (in int64 nanoseconds) applied to a granularity even smaller than one operation: a 100 byte read with a 1 second timeout could take 100 seconds, if the bytes all arrived on the network 1 second apart. This was confusing. Rather than making the timeout granularity be per-Read/Write, this CL makes callers set an absolute deadline (in time.Time) after which operations will fail. This makes it possible to set deadlines at higher levels, without knowing exactly how many read/write operations will happen in e.g. reading an HTTP request. Fixes #2723 R=r, rsc, dave CC=golang-dev https://golang.org/cl/5555048 --- conn.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/conn.go b/conn.go index 6a03fa8..e6cee12 100644 --- a/conn.go +++ b/conn.go @@ -15,6 +15,7 @@ import ( "io" "net" "sync" + "time" ) // A Conn represents a secured connection. @@ -86,24 +87,23 @@ func (c *Conn) RemoteAddr() net.Addr { return c.conn.RemoteAddr() } -// SetTimeout sets the read deadline associated with the connection. +// SetDeadline sets the read deadline associated with the connection. // There is no write deadline. -func (c *Conn) SetTimeout(nsec int64) error { - return c.conn.SetTimeout(nsec) +// A zero value for t means Read will not time out. +func (c *Conn) SetDeadline(t time.Time) error { + return c.conn.SetDeadline(t) } -// SetReadTimeout sets the time (in nanoseconds) that -// Read will wait for data before returning a net.Error -// with Timeout() == true. -// Setting nsec == 0 (the default) disables the deadline. -func (c *Conn) SetReadTimeout(nsec int64) error { - return c.conn.SetReadTimeout(nsec) +// SetReadDeadline sets the read deadline on the underlying connection. +// A zero value for t means Read will not time out. +func (c *Conn) SetReadDeadline(t time.Time) error { + return c.conn.SetReadDeadline(t) } -// SetWriteTimeout exists to satisfy the net.Conn interface +// SetWriteDeadline exists to satisfy the net.Conn interface // but is not implemented by TLS. It always returns an error. -func (c *Conn) SetWriteTimeout(nsec int64) error { - return errors.New("TLS does not support SetWriteTimeout") +func (c *Conn) SetWriteDeadline(t time.Time) error { + return errors.New("TLS does not support SetWriteDeadline") } // A halfConn represents one direction of the record layer @@ -744,7 +744,7 @@ func (c *Conn) Write(b []byte) (n int, err error) { } // Read can be made to time out and return a net.Error with Timeout() == true -// after a fixed time limit; see SetTimeout and SetReadTimeout. +// after a fixed time limit; see SetDeadline and SetReadDeadline. func (c *Conn) Read(b []byte) (n int, err error) { if err = c.Handshake(); err != nil { return