aboutsummaryrefslogtreecommitdiffstats
path: root/core/channel.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/channel.go')
-rw-r--r--core/channel.go26
1 files changed, 18 insertions, 8 deletions
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 {