X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=core%2Fchannel.go;h=1086c3639dbaf887f2a49bfdf8abc6cda671846d;hb=c09ee3241377aae2530a73d48c4e20641d76d0ee;hp=4cb576176d4d8c3fba7d75cb9bbfa665d8de29e5;hpb=debc52dea8a81417bb08ca5bb934c7876b6d65e0;p=govpp.git diff --git a/core/channel.go b/core/channel.go index 4cb5761..1086c36 100644 --- a/core/channel.go +++ b/core/channel.go @@ -19,6 +19,7 @@ import ( "fmt" "reflect" "strings" + "sync/atomic" "time" "github.com/sirupsen/logrus" @@ -109,17 +110,26 @@ type Channel struct { receiveReplyTimeout time.Duration // maximum time that we wait for receiver to consume reply } -func newChannel(id uint16, conn *Connection, codec MessageCodec, identifier MessageIdentifier, reqSize, replySize int) *Channel { - return &Channel{ - id: id, - conn: conn, - msgCodec: codec, - msgIdentifier: identifier, - reqChan: make(chan *vppRequest, reqSize), - replyChan: make(chan *vppReply, replySize), +func (c *Connection) newChannel(reqChanBufSize, replyChanBufSize int) *Channel { + // create new channel + chID := uint16(atomic.AddUint32(&c.maxChannelID, 1) & 0x7fff) + channel := &Channel{ + id: chID, + conn: c, + msgCodec: c.codec, + msgIdentifier: c, + reqChan: make(chan *vppRequest, reqChanBufSize), + replyChan: make(chan *vppReply, replyChanBufSize), replyTimeout: DefaultReplyTimeout, receiveReplyTimeout: ReplyChannelTimeout, } + + // store API channel within the client + c.channelsLock.Lock() + c.channels[chID] = channel + c.channelsLock.Unlock() + + return channel } func (ch *Channel) GetID() uint16 {