| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package netchan | |
| import ( | |
| "gob" | |
| "log" | |
| "net" | |
| "os" | |
| "sync" | |
| ) | |
| type Dir int | |
| const ( | |
| Recv Dir = iota | |
| Send | |
| ) | |
| // Mutex-protected encoder and decoder pair | |
| type encDec struct { | |
| decLock sync.Mutex | |
| dec *gob.Decoder | |
| encLock sync.Mutex | |
| enc *gob.Encoder | |
| } | |
| func newEncDec(conn net.Conn) *encDec { | |
| return &encDec{ | |
| dec: gob.NewDecoder(conn), | |
| enc: gob.NewEncoder(conn), | |
| } | |
| } | |
| func (ed *encDec) decode(e interface{}) os.Error { | |
| ed.decLock.Lock() | |
| defer ed.decLock.Unlock() | |
| err := ed.dec.Decode(e) | |
| if err != nil { | |
| log.Stderr("exporter decode:", err) | |
| // TODO: tear down connection | |
| return err | |
| } | |
| return nil | |
| } | |
| func (ed *encDec) encode(e0, e1 interface{}) os.Error { | |
| ed.encLock.Lock() | |
| defer ed.encLock.Unlock() | |
| err := ed.enc.Encode(e0) | |
| if err == nil && e1 != nil { | |
| err = ed.enc.Encode(e1) | |
| } | |
| if err != nil { | |
| log.Stderr("exporter encode:", err) | |
| // TODO: tear down connection? | |
| return err | |
| } | |
| return nil | |
| } |