From 147d6459d03507a6316f66f353a8d130fd123e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Lu=CC=88tke?= Date: Fri, 7 Sep 2012 15:33:33 -0400 Subject: [PATCH] Made socket writing threadsafe --- statsd.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/statsd.go b/statsd.go index 9024db7..ec4c1dc 100644 --- a/statsd.go +++ b/statsd.go @@ -7,13 +7,15 @@ import ( "io" "math/rand" "net" + "sync" "time" ) // A statsd client representing a connection to a statsd server. type Client struct { - Name string - rw *bufio.ReadWriter + Name string + rw *bufio.ReadWriter + mutex sync.Mutex } func millisecond(d time.Duration) int { @@ -39,8 +41,8 @@ func DialTimeout(addr string, timeout time.Duration) (*Client, error) { func newClient(name string, rw io.ReadWriter) *Client { return &Client{ - name, - bufio.NewReadWriter(bufio.NewReader(rw), bufio.NewWriter(rw)), + Name: name, + rw: bufio.NewReadWriter(bufio.NewReader(rw), bufio.NewWriter(rw)), } } @@ -82,6 +84,10 @@ func (c *Client) send(stat string, rate float64, format string, args ...interfac } format = fmt.Sprintf("%s:%s", stat, format) + + c.mutex.Lock() + defer c.mutex.Unlock() + _, err := fmt.Fprintf(c.rw, format, args...) if err != nil { return err