mirror of
https://github.com/golang/go
synced 2024-11-24 23:07:56 -07:00
netchan: allow chan of basic types now that gob can handle such
R=rsc CC=golang-dev https://golang.org/cl/1741041
This commit is contained in:
parent
5245ea771d
commit
eb20ba6d01
@ -225,7 +225,7 @@ func checkChan(chT interface{}, dir Dir) (*reflect.ChanValue, os.Error) {
|
|||||||
// Despite the literal signature, the effective signature is
|
// Despite the literal signature, the effective signature is
|
||||||
// Export(name string, chT chan T, dir Dir)
|
// Export(name string, chT chan T, dir Dir)
|
||||||
// where T must be a struct, pointer to struct, etc.
|
// where T must be a struct, pointer to struct, etc.
|
||||||
// TODO: fix gob interface so we can eliminate the need for pT, and for structs.
|
// TODO: fix reflection so we can eliminate the need for pT.
|
||||||
func (exp *Exporter) Export(name string, chT interface{}, dir Dir, pT interface{}) os.Error {
|
func (exp *Exporter) Export(name string, chT interface{}, dir Dir, pT interface{}) os.Error {
|
||||||
ch, err := checkChan(chT, dir)
|
ch, err := checkChan(chT, dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -136,7 +136,7 @@ func (imp *Importer) Import(name string, chT interface{}, dir Dir, pT interface{
|
|||||||
// err := imp.ImportNValues("name", ch, Recv, new(myType), 1)
|
// err := imp.ImportNValues("name", ch, Recv, new(myType), 1)
|
||||||
// if err != nil { log.Exit(err) }
|
// if err != nil { log.Exit(err) }
|
||||||
// fmt.Printf("%+v\n", <-ch)
|
// fmt.Printf("%+v\n", <-ch)
|
||||||
// TODO: fix gob interface so we can eliminate the need for pT, and for structs.
|
// TODO: fix reflection so we can eliminate the need for pT.
|
||||||
func (imp *Importer) ImportNValues(name string, chT interface{}, dir Dir, pT interface{}, n int) os.Error {
|
func (imp *Importer) ImportNValues(name string, chT interface{}, dir Dir, pT interface{}, n int) os.Error {
|
||||||
ch, err := checkChan(chT, dir)
|
ch, err := checkChan(chT, dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -147,9 +147,6 @@ func (imp *Importer) ImportNValues(name string, chT interface{}, dir Dir, pT int
|
|||||||
if _, ok := rt.(*reflect.PtrType); !ok {
|
if _, ok := rt.(*reflect.PtrType); !ok {
|
||||||
return os.ErrorString("not a pointer:" + rt.String())
|
return os.ErrorString("not a pointer:" + rt.String())
|
||||||
}
|
}
|
||||||
if _, ok := reflect.Indirect(reflect.NewValue(pT)).(*reflect.StructValue); !ok {
|
|
||||||
return os.ErrorString("not a pointer to a struct:" + rt.String())
|
|
||||||
}
|
|
||||||
imp.chanLock.Lock()
|
imp.chanLock.Lock()
|
||||||
defer imp.chanLock.Unlock()
|
defer imp.chanLock.Unlock()
|
||||||
_, present := imp.chans[name]
|
_, present := imp.chans[name]
|
||||||
|
@ -6,43 +6,38 @@ package netchan
|
|||||||
|
|
||||||
import "testing"
|
import "testing"
|
||||||
|
|
||||||
type value struct {
|
|
||||||
i int
|
|
||||||
s string
|
|
||||||
}
|
|
||||||
|
|
||||||
const count = 10 // number of items in most tests
|
const count = 10 // number of items in most tests
|
||||||
const closeCount = 5 // number of items when sender closes early
|
const closeCount = 5 // number of items when sender closes early
|
||||||
|
|
||||||
func exportSend(exp *Exporter, n int, t *testing.T) {
|
func exportSend(exp *Exporter, n int, t *testing.T) {
|
||||||
ch := make(chan value)
|
ch := make(chan int)
|
||||||
err := exp.Export("exportedSend", ch, Send, new(value))
|
err := exp.Export("exportedSend", ch, Send, new(int))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("exportSend:", err)
|
t.Fatal("exportSend:", err)
|
||||||
}
|
}
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
ch <- value{23 + i, "hello"}
|
ch <- 23+i
|
||||||
}
|
}
|
||||||
close(ch)
|
close(ch)
|
||||||
}
|
}
|
||||||
|
|
||||||
func exportReceive(exp *Exporter, t *testing.T) {
|
func exportReceive(exp *Exporter, t *testing.T) {
|
||||||
ch := make(chan value)
|
ch := make(chan int)
|
||||||
err := exp.Export("exportedRecv", ch, Recv, new(value))
|
err := exp.Export("exportedRecv", ch, Recv, new(int))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("exportReceive:", err)
|
t.Fatal("exportReceive:", err)
|
||||||
}
|
}
|
||||||
for i := 0; i < count; i++ {
|
for i := 0; i < count; i++ {
|
||||||
v := <-ch
|
v := <-ch
|
||||||
if v.i != 45+i || v.s != "hello" {
|
if v != 45+i {
|
||||||
t.Errorf("export Receive: bad value: expected 4%d, hello; got %+v", 45+i, v)
|
t.Errorf("export Receive: bad value: expected 4%d; got %d", 45+i, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func importReceive(imp *Importer, t *testing.T) {
|
func importReceive(imp *Importer, t *testing.T) {
|
||||||
ch := make(chan value)
|
ch := make(chan int)
|
||||||
err := imp.ImportNValues("exportedSend", ch, Recv, new(value), count)
|
err := imp.ImportNValues("exportedSend", ch, Recv, new(int), count)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("importReceive:", err)
|
t.Fatal("importReceive:", err)
|
||||||
}
|
}
|
||||||
@ -54,20 +49,20 @@ func importReceive(imp *Importer, t *testing.T) {
|
|||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if v.i != 23+i || v.s != "hello" {
|
if v != 23+i {
|
||||||
t.Errorf("importReceive: bad value: expected %d, hello; got %+v", 23+i, v)
|
t.Errorf("importReceive: bad value: expected %d; got %+d", 23+i, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func importSend(imp *Importer, t *testing.T) {
|
func importSend(imp *Importer, t *testing.T) {
|
||||||
ch := make(chan value)
|
ch := make(chan int)
|
||||||
err := imp.ImportNValues("exportedRecv", ch, Send, new(value), count)
|
err := imp.ImportNValues("exportedRecv", ch, Send, new(int), count)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("importSend:", err)
|
t.Fatal("importSend:", err)
|
||||||
}
|
}
|
||||||
for i := 0; i < count; i++ {
|
for i := 0; i < count; i++ {
|
||||||
ch <- value{45 + i, "hello"}
|
ch <- 45+i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user