| | |
| | | const std::string shm_name("ShmSendRecv"); |
| | | ShmRemover auto_remove(shm_name); |
| | | const int qlen = 64; |
| | | const size_t msg_length = 1000; |
| | | const size_t msg_length = 100; |
| | | std::string msg_content(msg_length, 'a'); |
| | | msg_content[20] = '\0'; |
| | | const std::string client_proc_id = "client_proc"; |
| | | const std::string server_proc_id = "server_proc"; |
| | | |
| | | SharedMemory shm(shm_name, 1024 * 1024 * 50); |
| | | SharedMemory shm(shm_name, 1024 * 1024 * 512); |
| | | auto Avail = [&]() { return shm.get_free_memory(); }; |
| | | auto init_avail = Avail(); |
| | | ShmSocket srv(shm, qlen); |
| | | ShmSocket cli(shm, qlen); |
| | | |
| | | MsgI request_rc; |
| | | MsgRequestTopic req_body; |
| | | req_body.set_topic("topic"); |
| | | req_body.set_data(msg_content); |
| | | auto req_head(InitMsgHead(GetType(req_body), client_proc_id)); |
| | | req_head.add_route()->set_mq_id(&cli.id(), cli.id().size()); |
| | | request_rc.MakeRC(shm, req_head, req_body); |
| | | DEFER1(request_rc.Release(shm)); |
| | | |
| | | MsgRequestTopic reply_body; |
| | | reply_body.set_topic("topic"); |
| | | reply_body.set_data(msg_content); |
| | | auto reply_head(InitMsgHead(GetType(reply_body), server_proc_id)); |
| | | reply_head.add_route()->set_mq_id(&srv.id(), srv.id().size()); |
| | | MsgI reply_rc; |
| | | reply_rc.MakeRC(shm, reply_head, reply_body); |
| | | DEFER1(reply_rc.Release(shm)); |
| | | |
| | | int ncli = 1; |
| | | uint64_t nmsg = 1000 * 1000 * 1; |
| | | std::atomic<uint64_t> count(0); |
| | | |
| | | std::atomic<ptime> last_time(Now() - seconds(1)); |
| | | std::atomic<int64_t> last_time(NowSec() - 1); |
| | | std::atomic<uint64_t> last_count(0); |
| | | |
| | | auto PrintStatus = [&](int64_t cur) { |
| | | std::cout << "time: " << cur; |
| | | printf(", total msg:%10ld, speed:[%8ld/s], used mem:%8ld\n", |
| | | count.load(), count - last_count.exchange(count), init_avail - Avail()); |
| | | }; |
| | | auto onRecv = [&](ShmSocket &sock, MsgI &msg, BHMsgHead &head) { |
| | | ++count; |
| | | auto cur = NowSec(); |
| | | if (last_time.exchange(cur) < cur) { |
| | | PrintStatus(cur); |
| | | } |
| | | }; |
| | | cli.Start(onRecv, 2); |
| | | |
| | | auto Client = [&](int cli_id, int nmsg) { |
| | | for (int i = 0; i < nmsg; ++i) { |
| | |
| | | req_body.set_topic("topic"); |
| | | req_body.set_data(msg_content); |
| | | auto req_head(InitMsgHead(GetType(req_body), client_proc_id)); |
| | | req_head.add_route()->set_mq_id(&cli.id(), cli.id().size()); |
| | | return cli.Send(&srv.id(), req_head, req_body); |
| | | }; |
| | | auto ReqRC = [&]() { return cli.Send(&srv.id(), request_rc); }; |
| | | |
| | | if (!ReqRC()) { |
| | | printf("********** client send error.\n"); |
| | | continue; |
| | | } |
| | | MsgI msg; |
| | | BHMsgHead head; |
| | | if (!cli.SyncRecv(msg, head, 1000)) { |
| | | printf("********** client recv error.\n"); |
| | | } else { |
| | | DEFER1(msg.Release(shm)); |
| | | ++count; |
| | | auto cur = Now(); |
| | | if (last_time.exchange(cur) < cur) { |
| | | std::cout << "time: " << cur; |
| | | printf(", total msg:%10ld, speed:[%8ld/s], used mem:%8ld, refcount:%d\n", |
| | | count.load(), count - last_count.exchange(count), init_avail - Avail(), request_rc.Count()); |
| | | } |
| | | } |
| | | Req(); |
| | | } |
| | | }; |
| | | |
| | |
| | | auto reply_head(InitMsgHead(GetType(reply_body), server_proc_id, req_head.msg_id())); |
| | | return srv.Send(&src_id, reply_head, reply_body); |
| | | }; |
| | | auto ReplyRC = [&]() { return srv.Send(&src_id, reply_rc); }; |
| | | |
| | | if (ReplyRC()) { |
| | | } |
| | | Reply(); |
| | | } |
| | | } |
| | | } |
| | |
| | | DEFER1(printf("Request Reply Test:");); |
| | | |
| | | ThreadManager clients, servers; |
| | | for (int i = 0; i < qlen; ++i) { servers.Launch(Server); } |
| | | int ncli = 100 * 1; |
| | | uint64_t nmsg = 100 * 100 * 2; |
| | | for (int i = 0; i < 2; ++i) { servers.Launch(Server); } |
| | | printf("client threads: %d, msgs : %ld, total msg: %ld\n", ncli, nmsg, ncli * nmsg); |
| | | for (int i = 0; i < ncli; ++i) { clients.Launch(Client, i, nmsg); } |
| | | clients.WaitAll(); |
| | | printf("request ok: %ld\n", count.load()); |
| | | do { |
| | | std::this_thread::sleep_for(100ms); |
| | | } while (count.load() < ncli * nmsg); |
| | | PrintStatus(NowSec()); |
| | | stop = true; |
| | | servers.WaitAll(); |
| | | // BOOST_CHECK_THROW(reply.Count(), int); |