From c4ccfc75f0698e148cfa37a3a1dda1a46bb29109 Mon Sep 17 00:00:00 2001 From: Ondrej Fabry Date: Tue, 21 Aug 2018 15:47:30 +0200 Subject: Fix perf-bench example Change-Id: I62a7a27adbb44b9d8070b448c17bb7781b0637fe Signed-off-by: Ondrej Fabry --- examples/bin_api/vpe.api.json | 419 +++++++++++++++++++ examples/bin_api/vpe/vpe.ba.go | 755 ++++++++++++++++++++++++++++++++++ examples/cmd/perf-bench/perf-bench.go | 58 +-- 3 files changed, 1188 insertions(+), 44 deletions(-) create mode 100644 examples/bin_api/vpe.api.json create mode 100644 examples/bin_api/vpe/vpe.ba.go diff --git a/examples/bin_api/vpe.api.json b/examples/bin_api/vpe.api.json new file mode 100644 index 0000000..9f973af --- /dev/null +++ b/examples/bin_api/vpe.api.json @@ -0,0 +1,419 @@ +{ + "messages": [ + [ + "control_ping", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "client_index" + ], + [ + "u32", + "context" + ], + { + "crc": "0x51077d14" + } + ], + [ + "control_ping_reply", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "context" + ], + [ + "i32", + "retval" + ], + [ + "u32", + "client_index" + ], + [ + "u32", + "vpe_pid" + ], + { + "crc": "0xf6b0b8ca" + } + ], + [ + "cli", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "client_index" + ], + [ + "u32", + "context" + ], + [ + "u64", + "cmd_in_shmem" + ], + { + "crc": "0x23bfbfff" + } + ], + [ + "cli_inband", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "client_index" + ], + [ + "u32", + "context" + ], + [ + "u32", + "length" + ], + [ + "u8", + "cmd", + 0, + "length" + ], + { + "crc": "0x74e00a49" + } + ], + [ + "cli_reply", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "context" + ], + [ + "i32", + "retval" + ], + [ + "u64", + "reply_in_shmem" + ], + { + "crc": "0x06d68297" + } + ], + [ + "cli_inband_reply", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "context" + ], + [ + "i32", + "retval" + ], + [ + "u32", + "length" + ], + [ + "u8", + "reply", + 0, + "length" + ], + { + "crc": "0x1f22bbb8" + } + ], + [ + "get_node_index", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "client_index" + ], + [ + "u32", + "context" + ], + [ + "u8", + "node_name", + 64 + ], + { + "crc": "0x6c9a495d" + } + ], + [ + "get_node_index_reply", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "context" + ], + [ + "i32", + "retval" + ], + [ + "u32", + "node_index" + ], + { + "crc": "0xa8600b89" + } + ], + [ + "add_node_next", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "client_index" + ], + [ + "u32", + "context" + ], + [ + "u8", + "node_name", + 64 + ], + [ + "u8", + "next_name", + 64 + ], + { + "crc": "0x9ab92f7a" + } + ], + [ + "add_node_next_reply", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "context" + ], + [ + "i32", + "retval" + ], + [ + "u32", + "next_index" + ], + { + "crc": "0x2ed75f32" + } + ], + [ + "show_version", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "client_index" + ], + [ + "u32", + "context" + ], + { + "crc": "0x51077d14" + } + ], + [ + "show_version_reply", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "context" + ], + [ + "i32", + "retval" + ], + [ + "u8", + "program", + 32 + ], + [ + "u8", + "version", + 32 + ], + [ + "u8", + "build_date", + 32 + ], + [ + "u8", + "build_directory", + 256 + ], + { + "crc": "0x8b5a13b4" + } + ], + [ + "get_node_graph", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "client_index" + ], + [ + "u32", + "context" + ], + { + "crc": "0x51077d14" + } + ], + [ + "get_node_graph_reply", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "context" + ], + [ + "i32", + "retval" + ], + [ + "u64", + "reply_in_shmem" + ], + { + "crc": "0x06d68297" + } + ], + [ + "get_next_index", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "client_index" + ], + [ + "u32", + "context" + ], + [ + "u8", + "node_name", + 64 + ], + [ + "u8", + "next_name", + 64 + ], + { + "crc": "0x9ab92f7a" + } + ], + [ + "get_next_index_reply", + [ + "u16", + "_vl_msg_id" + ], + [ + "u32", + "context" + ], + [ + "i32", + "retval" + ], + [ + "u32", + "next_index" + ], + { + "crc": "0x2ed75f32" + } + ] + ], + "vl_api_version": "0x9a1baa50", + "unions": [], + "services": { + "cli_inband": { + "reply": "cli_inband_reply" + }, + "get_node_index": { + "reply": "get_node_index_reply" + }, + "cli": { + "reply": "cli_reply" + }, + "show_version": { + "reply": "show_version_reply" + }, + "get_node_graph": { + "reply": "get_node_graph_reply" + }, + "get_next_index": { + "reply": "get_next_index_reply" + }, + "add_node_next": { + "reply": "add_node_next_reply" + }, + "control_ping": { + "reply": "control_ping_reply" + } + }, + "enums": [], + "types": [] +} diff --git a/examples/bin_api/vpe/vpe.ba.go b/examples/bin_api/vpe/vpe.ba.go new file mode 100644 index 0000000..f91a164 --- /dev/null +++ b/examples/bin_api/vpe/vpe.ba.go @@ -0,0 +1,755 @@ +// Code generated by GoVPP binapi-generator. DO NOT EDIT. +// source: vpe.api.json + +/* +Package vpe is a generated VPP binary API of the 'vpe' VPP module. + +It is generated from this file: + vpe.api.json + +It contains these VPP binary API objects: + 16 messages + 8 services +*/ +package vpe + +import "git.fd.io/govpp.git/api" +import "github.com/lunixbochs/struc" +import "bytes" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = struc.Pack +var _ = bytes.NewBuffer + +/* Messages */ + +// ControlPing represents the VPP binary API message 'control_ping'. +// Generated from 'vpe.api.json', line 4: +// +// "control_ping", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "client_index" +// ], +// [ +// "u32", +// "context" +// ], +// { +// "crc": "0x51077d14" +// } +// +type ControlPing struct{} + +func (*ControlPing) GetMessageName() string { + return "control_ping" +} +func (*ControlPing) GetCrcString() string { + return "51077d14" +} +func (*ControlPing) GetMessageType() api.MessageType { + return api.RequestMessage +} +func NewControlPing() api.Message { + return &ControlPing{} +} + +// ControlPingReply represents the VPP binary API message 'control_ping_reply'. +// Generated from 'vpe.api.json', line 22: +// +// "control_ping_reply", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "i32", +// "retval" +// ], +// [ +// "u32", +// "client_index" +// ], +// [ +// "u32", +// "vpe_pid" +// ], +// { +// "crc": "0xf6b0b8ca" +// } +// +type ControlPingReply struct { + Retval int32 + ClientIndex uint32 + VpePID uint32 +} + +func (*ControlPingReply) GetMessageName() string { + return "control_ping_reply" +} +func (*ControlPingReply) GetCrcString() string { + return "f6b0b8ca" +} +func (*ControlPingReply) GetMessageType() api.MessageType { + return api.ReplyMessage +} +func NewControlPingReply() api.Message { + return &ControlPingReply{} +} + +// Cli represents the VPP binary API message 'cli'. +// Generated from 'vpe.api.json', line 48: +// +// "cli", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "client_index" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "u64", +// "cmd_in_shmem" +// ], +// { +// "crc": "0x23bfbfff" +// } +// +type Cli struct { + CmdInShmem uint64 +} + +func (*Cli) GetMessageName() string { + return "cli" +} +func (*Cli) GetCrcString() string { + return "23bfbfff" +} +func (*Cli) GetMessageType() api.MessageType { + return api.RequestMessage +} +func NewCli() api.Message { + return &Cli{} +} + +// CliInband represents the VPP binary API message 'cli_inband'. +// Generated from 'vpe.api.json', line 70: +// +// "cli_inband", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "client_index" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "u32", +// "length" +// ], +// [ +// "u8", +// "cmd", +// 0, +// "length" +// ], +// { +// "crc": "0x74e00a49" +// } +// +type CliInband struct { + Length uint32 `struc:"sizeof=Cmd"` + Cmd []byte +} + +func (*CliInband) GetMessageName() string { + return "cli_inband" +} +func (*CliInband) GetCrcString() string { + return "74e00a49" +} +func (*CliInband) GetMessageType() api.MessageType { + return api.RequestMessage +} +func NewCliInband() api.Message { + return &CliInband{} +} + +// CliReply represents the VPP binary API message 'cli_reply'. +// Generated from 'vpe.api.json', line 98: +// +// "cli_reply", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "i32", +// "retval" +// ], +// [ +// "u64", +// "reply_in_shmem" +// ], +// { +// "crc": "0x06d68297" +// } +// +type CliReply struct { + Retval int32 + ReplyInShmem uint64 +} + +func (*CliReply) GetMessageName() string { + return "cli_reply" +} +func (*CliReply) GetCrcString() string { + return "06d68297" +} +func (*CliReply) GetMessageType() api.MessageType { + return api.ReplyMessage +} +func NewCliReply() api.Message { + return &CliReply{} +} + +// CliInbandReply represents the VPP binary API message 'cli_inband_reply'. +// Generated from 'vpe.api.json', line 120: +// +// "cli_inband_reply", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "i32", +// "retval" +// ], +// [ +// "u32", +// "length" +// ], +// [ +// "u8", +// "reply", +// 0, +// "length" +// ], +// { +// "crc": "0x1f22bbb8" +// } +// +type CliInbandReply struct { + Retval int32 + Length uint32 `struc:"sizeof=Reply"` + Reply []byte +} + +func (*CliInbandReply) GetMessageName() string { + return "cli_inband_reply" +} +func (*CliInbandReply) GetCrcString() string { + return "1f22bbb8" +} +func (*CliInbandReply) GetMessageType() api.MessageType { + return api.ReplyMessage +} +func NewCliInbandReply() api.Message { + return &CliInbandReply{} +} + +// GetNodeIndex represents the VPP binary API message 'get_node_index'. +// Generated from 'vpe.api.json', line 148: +// +// "get_node_index", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "client_index" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "u8", +// "node_name", +// 64 +// ], +// { +// "crc": "0x6c9a495d" +// } +// +type GetNodeIndex struct { + NodeName []byte `struc:"[64]byte"` +} + +func (*GetNodeIndex) GetMessageName() string { + return "get_node_index" +} +func (*GetNodeIndex) GetCrcString() string { + return "6c9a495d" +} +func (*GetNodeIndex) GetMessageType() api.MessageType { + return api.RequestMessage +} +func NewGetNodeIndex() api.Message { + return &GetNodeIndex{} +} + +// GetNodeIndexReply represents the VPP binary API message 'get_node_index_reply'. +// Generated from 'vpe.api.json', line 171: +// +// "get_node_index_reply", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "i32", +// "retval" +// ], +// [ +// "u32", +// "node_index" +// ], +// { +// "crc": "0xa8600b89" +// } +// +type GetNodeIndexReply struct { + Retval int32 + NodeIndex uint32 +} + +func (*GetNodeIndexReply) GetMessageName() string { + return "get_node_index_reply" +} +func (*GetNodeIndexReply) GetCrcString() string { + return "a8600b89" +} +func (*GetNodeIndexReply) GetMessageType() api.MessageType { + return api.ReplyMessage +} +func NewGetNodeIndexReply() api.Message { + return &GetNodeIndexReply{} +} + +// AddNodeNext represents the VPP binary API message 'add_node_next'. +// Generated from 'vpe.api.json', line 193: +// +// "add_node_next", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "client_index" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "u8", +// "node_name", +// 64 +// ], +// [ +// "u8", +// "next_name", +// 64 +// ], +// { +// "crc": "0x9ab92f7a" +// } +// +type AddNodeNext struct { + NodeName []byte `struc:"[64]byte"` + NextName []byte `struc:"[64]byte"` +} + +func (*AddNodeNext) GetMessageName() string { + return "add_node_next" +} +func (*AddNodeNext) GetCrcString() string { + return "9ab92f7a" +} +func (*AddNodeNext) GetMessageType() api.MessageType { + return api.RequestMessage +} +func NewAddNodeNext() api.Message { + return &AddNodeNext{} +} + +// AddNodeNextReply represents the VPP binary API message 'add_node_next_reply'. +// Generated from 'vpe.api.json', line 221: +// +// "add_node_next_reply", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "i32", +// "retval" +// ], +// [ +// "u32", +// "next_index" +// ], +// { +// "crc": "0x2ed75f32" +// } +// +type AddNodeNextReply struct { + Retval int32 + NextIndex uint32 +} + +func (*AddNodeNextReply) GetMessageName() string { + return "add_node_next_reply" +} +func (*AddNodeNextReply) GetCrcString() string { + return "2ed75f32" +} +func (*AddNodeNextReply) GetMessageType() api.MessageType { + return api.ReplyMessage +} +func NewAddNodeNextReply() api.Message { + return &AddNodeNextReply{} +} + +// ShowVersion represents the VPP binary API message 'show_version'. +// Generated from 'vpe.api.json', line 243: +// +// "show_version", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "client_index" +// ], +// [ +// "u32", +// "context" +// ], +// { +// "crc": "0x51077d14" +// } +// +type ShowVersion struct{} + +func (*ShowVersion) GetMessageName() string { + return "show_version" +} +func (*ShowVersion) GetCrcString() string { + return "51077d14" +} +func (*ShowVersion) GetMessageType() api.MessageType { + return api.RequestMessage +} +func NewShowVersion() api.Message { + return &ShowVersion{} +} + +// ShowVersionReply represents the VPP binary API message 'show_version_reply'. +// Generated from 'vpe.api.json', line 261: +// +// "show_version_reply", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "i32", +// "retval" +// ], +// [ +// "u8", +// "program", +// 32 +// ], +// [ +// "u8", +// "version", +// 32 +// ], +// [ +// "u8", +// "build_date", +// 32 +// ], +// [ +// "u8", +// "build_directory", +// 256 +// ], +// { +// "crc": "0x8b5a13b4" +// } +// +type ShowVersionReply struct { + Retval int32 + Program []byte `struc:"[32]byte"` + Version []byte `struc:"[32]byte"` + BuildDate []byte `struc:"[32]byte"` + BuildDirectory []byte `struc:"[256]byte"` +} + +func (*ShowVersionReply) GetMessageName() string { + return "show_version_reply" +} +func (*ShowVersionReply) GetCrcString() string { + return "8b5a13b4" +} +func (*ShowVersionReply) GetMessageType() api.MessageType { + return api.ReplyMessage +} +func NewShowVersionReply() api.Message { + return &ShowVersionReply{} +} + +// GetNodeGraph represents the VPP binary API message 'get_node_graph'. +// Generated from 'vpe.api.json', line 299: +// +// "get_node_graph", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "client_index" +// ], +// [ +// "u32", +// "context" +// ], +// { +// "crc": "0x51077d14" +// } +// +type GetNodeGraph struct{} + +func (*GetNodeGraph) GetMessageName() string { + return "get_node_graph" +} +func (*GetNodeGraph) GetCrcString() string { + return "51077d14" +} +func (*GetNodeGraph) GetMessageType() api.MessageType { + return api.RequestMessage +} +func NewGetNodeGraph() api.Message { + return &GetNodeGraph{} +} + +// GetNodeGraphReply represents the VPP binary API message 'get_node_graph_reply'. +// Generated from 'vpe.api.json', line 317: +// +// "get_node_graph_reply", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "i32", +// "retval" +// ], +// [ +// "u64", +// "reply_in_shmem" +// ], +// { +// "crc": "0x06d68297" +// } +// +type GetNodeGraphReply struct { + Retval int32 + ReplyInShmem uint64 +} + +func (*GetNodeGraphReply) GetMessageName() string { + return "get_node_graph_reply" +} +func (*GetNodeGraphReply) GetCrcString() string { + return "06d68297" +} +func (*GetNodeGraphReply) GetMessageType() api.MessageType { + return api.ReplyMessage +} +func NewGetNodeGraphReply() api.Message { + return &GetNodeGraphReply{} +} + +// GetNextIndex represents the VPP binary API message 'get_next_index'. +// Generated from 'vpe.api.json', line 339: +// +// "get_next_index", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "client_index" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "u8", +// "node_name", +// 64 +// ], +// [ +// "u8", +// "next_name", +// 64 +// ], +// { +// "crc": "0x9ab92f7a" +// } +// +type GetNextIndex struct { + NodeName []byte `struc:"[64]byte"` + NextName []byte `struc:"[64]byte"` +} + +func (*GetNextIndex) GetMessageName() string { + return "get_next_index" +} +func (*GetNextIndex) GetCrcString() string { + return "9ab92f7a" +} +func (*GetNextIndex) GetMessageType() api.MessageType { + return api.RequestMessage +} +func NewGetNextIndex() api.Message { + return &GetNextIndex{} +} + +// GetNextIndexReply represents the VPP binary API message 'get_next_index_reply'. +// Generated from 'vpe.api.json', line 367: +// +// "get_next_index_reply", +// [ +// "u16", +// "_vl_msg_id" +// ], +// [ +// "u32", +// "context" +// ], +// [ +// "i32", +// "retval" +// ], +// [ +// "u32", +// "next_index" +// ], +// { +// "crc": "0x2ed75f32" +// } +// +type GetNextIndexReply struct { + Retval int32 + NextIndex uint32 +} + +func (*GetNextIndexReply) GetMessageName() string { + return "get_next_index_reply" +} +func (*GetNextIndexReply) GetCrcString() string { + return "2ed75f32" +} +func (*GetNextIndexReply) GetMessageType() api.MessageType { + return api.ReplyMessage +} +func NewGetNextIndexReply() api.Message { + return &GetNextIndexReply{} +} + +/* Services */ + +type Services interface { + AddNodeNext(*AddNodeNext) (*AddNodeNextReply, error) + Cli(*Cli) (*CliReply, error) + CliInband(*CliInband) (*CliInbandReply, error) + ControlPing(*ControlPing) (*ControlPingReply, error) + GetNextIndex(*GetNextIndex) (*GetNextIndexReply, error) + GetNodeGraph(*GetNodeGraph) (*GetNodeGraphReply, error) + GetNodeIndex(*GetNodeIndex) (*GetNodeIndexReply, error) + ShowVersion(*ShowVersion) (*ShowVersionReply, error) +} + +func init() { + api.RegisterMessage((*ControlPing)(nil), "vpe.ControlPing") + api.RegisterMessage((*ControlPingReply)(nil), "vpe.ControlPingReply") + api.RegisterMessage((*Cli)(nil), "vpe.Cli") + api.RegisterMessage((*CliInband)(nil), "vpe.CliInband") + api.RegisterMessage((*CliReply)(nil), "vpe.CliReply") + api.RegisterMessage((*CliInbandReply)(nil), "vpe.CliInbandReply") + api.RegisterMessage((*GetNodeIndex)(nil), "vpe.GetNodeIndex") + api.RegisterMessage((*GetNodeIndexReply)(nil), "vpe.GetNodeIndexReply") + api.RegisterMessage((*AddNodeNext)(nil), "vpe.AddNodeNext") + api.RegisterMessage((*AddNodeNextReply)(nil), "vpe.AddNodeNextReply") + api.RegisterMessage((*ShowVersion)(nil), "vpe.ShowVersion") + api.RegisterMessage((*ShowVersionReply)(nil), "vpe.ShowVersionReply") + api.RegisterMessage((*GetNodeGraph)(nil), "vpe.GetNodeGraph") + api.RegisterMessage((*GetNodeGraphReply)(nil), "vpe.GetNodeGraphReply") + api.RegisterMessage((*GetNextIndex)(nil), "vpe.GetNextIndex") + api.RegisterMessage((*GetNextIndexReply)(nil), "vpe.GetNextIndexReply") +} diff --git a/examples/cmd/perf-bench/perf-bench.go b/examples/cmd/perf-bench/perf-bench.go index b1f4dcf..5b4b17d 100644 --- a/examples/cmd/perf-bench/perf-bench.go +++ b/examples/cmd/perf-bench/perf-bench.go @@ -21,7 +21,6 @@ import ( "fmt" "log" "os" - "sync" "time" "github.com/pkg/profile" @@ -30,12 +29,12 @@ import ( "git.fd.io/govpp.git" "git.fd.io/govpp.git/api" "git.fd.io/govpp.git/core" - "git.fd.io/govpp.git/core/bin_api/vpe" + "git.fd.io/govpp.git/examples/bin_api/vpe" ) const ( defaultSyncRequestCount = 1000 - defaultAsyncRequestCount = 1000000 + defaultAsyncRequestCount = 10000 ) func main() { @@ -43,7 +42,7 @@ func main() { var sync, prof bool var cnt int flag.BoolVar(&sync, "sync", false, "run synchronous perf test") - flag.IntVar(&cnt, "cnt", 0, "count of requests to be sent to VPP") + flag.IntVar(&cnt, "count", 0, "count of requests to be sent to VPP") flag.BoolVar(&prof, "prof", false, "generate profile data") flag.Parse() @@ -113,50 +112,21 @@ func syncTest(ch api.Channel, cnt int) { func asyncTest(ch api.Channel, cnt int) { fmt.Printf("Running asynchronous perf test with %d requests...\n", cnt) - // start a new go routine that reads the replies - var wg sync.WaitGroup - wg.Add(1) - go readAsyncReplies(ch, cnt, &wg) + ctxChan := make(chan api.RequestCtx, cnt) - // send asynchronous requests - sendAsyncRequests(ch, cnt) - - // wait until all replies are recieved - wg.Wait() -} - -func sendAsyncRequests(ch api.Channel, cnt int) { - for i := 0; i < cnt; i++ { - ch.GetRequestChannel() <- &api.VppRequest{ - Message: &vpe.ControlPing{}, - } - } -} - -func readAsyncReplies(ch api.Channel, expectedCnt int, wg *sync.WaitGroup) { - cnt := 0 - - for { - // receive a reply - reply := <-ch.GetReplyChannel() - if reply.Error != nil { - log.Println("Error in reply:", reply.Error) - os.Exit(1) + go func() { + for i := 0; i < cnt; i++ { + ctxChan <- ch.SendRequest(&vpe.ControlPing{}) } + close(ctxChan) + fmt.Printf("Sending asynchronous requests finished\n") + }() - // decode the message - msg := &vpe.ControlPingReply{} - err := ch.GetMessageDecoder().DecodeMsg(reply.Data, msg) - if reply.Error != nil { - log.Println("Error by decoding:", err) + for ctx := range ctxChan { + reply := &vpe.ControlPingReply{} + if err := ctx.ReceiveReply(reply); err != nil { + log.Println("Error in reply:", err) os.Exit(1) } - - // count and return if done - cnt++ - if cnt >= expectedCnt { - wg.Done() - return - } } } -- cgit 1.2.3-korg