// 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 }