mirror of
https://github.com/golang/go
synced 2024-10-04 22:31:22 -06:00
64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
|
// 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
|
||
|
}
|