Skip to content
This repository was archived by the owner on Jul 15, 2021. It is now read-only.

Commit 15a2ebc

Browse files
author
年迈的老秋风Windy
committed
Speed Optimization
Optimize the speed of Socket Wrapper.
1 parent 06dde69 commit 15a2ebc

2 files changed

Lines changed: 20 additions & 11 deletions

File tree

include/XSYDTCPSocket.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
private:
1919

2020
protected:
21-
static std::map<uv_tcp_t*, std::vector<TCPAsyncClientSocket*>> m_MyClassPtrs;
21+
static std::map<SocketWorker*,std::map<uv_tcp_t*, std::vector<TCPAsyncClientSocket*>>> m_MyClassPtrs;
2222
IpAddr m_remoteAddr;
2323
std::shared_ptr<uv_tcp_t> m_ClientSocketHandle;
2424
bool m_Connected;

src/XSYDTCPSocket.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
#include <XSYDTCPSocket.h>
22

3-
std::map<uv_tcp_t*, std::vector<EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket*>> EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_MyClassPtrs;
3+
std::map<EasyCrossPlatform::Network::Socket::SocketWorker*,std::map<uv_tcp_t*, std::vector<EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket*>>> EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_MyClassPtrs;
44
std::mutex EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::sharedMutex;
55
void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_connect_cb(uv_connect_t * req, int status)
66
{
77
uv_tcp_t* mytcpHandle = (uv_tcp_t*)req->handle;
88
free(req);
9-
std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[mytcpHandle];
9+
std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(SocketWorker*) req->data][mytcpHandle];
1010
for (auto iter = myClasses.begin(); iter != myClasses.end(); iter++) {
1111
if (status < 0) {
1212
(*iter)->onConnected(false);
@@ -21,7 +21,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_connect_cb(u
2121

2222
void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_close_cb(uv_handle_t * handle)
2323
{
24-
std::vector<TCPAsyncClientSocket*> MyClasses = TCPAsyncClientSocket::m_MyClassPtrs[((uv_tcp_t*)handle)];
24+
std::vector<TCPAsyncClientSocket*> MyClasses = TCPAsyncClientSocket::m_MyClassPtrs[(SocketWorker*) handle->data][((uv_tcp_t*)handle)];
2525

2626
if (!MyClasses.empty()) {
2727
for (auto iter = MyClasses.begin(); iter != MyClasses.end(); iter++) {
@@ -40,7 +40,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_close_cb(uv_
4040
void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_read_cb(uv_stream_t * stream, ssize_t nread, const uv_buf_t * buf)
4141
{
4242
std::string data;
43-
std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(uv_tcp_t*)stream];
43+
std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(SocketWorker*) stream->data][(uv_tcp_t*)stream];
4444
std::string myErrMsg;
4545

4646
if (nread < 0 && nread != UV_EOF) {
@@ -77,7 +77,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_shutdown_cb(
7777
{
7878
//废弃, 暂时不用
7979
if (state < 0) {
80-
std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(uv_tcp_t*)req->handle];
80+
std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(SocketWorker*)req->data][(uv_tcp_t*)req->handle];
8181
for (auto iter = myClasses.begin(); iter != myClasses.end(); iter++) {
8282
(*iter)->onError(state, uv_err_name(state));
8383
(*iter)->Closing = false;
@@ -123,7 +123,7 @@ EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::TCPAsyncClientSocket(c
123123
this->mySocketWorker = oldClient.mySocketWorker;
124124
if (oldClient.Inited) {
125125
this->mySocketWorker->m_num_Client++;
126-
this->m_MyClassPtrs[this->m_ClientSocketHandle.get()].push_back(this);
126+
this->m_MyClassPtrs[this->mySocketWorker][this->m_ClientSocketHandle.get()].push_back(this);
127127
}
128128
}
129129
void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::setWorker(SocketWorker & socketWorker)
@@ -141,9 +141,13 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::Init()
141141

142142
this->Inited = true;
143143
this->m_ClientSocketHandle = std::shared_ptr<uv_tcp_t>(new uv_tcp_t);
144+
this->m_ClientSocketHandle.get()->data = (void*)this->mySocketWorker;
144145
//this->m_MyClassPtrs[this->m_ClientSocketHandle.get()] = std::pair<std::mutex*, std::vector<TCPAsyncClientSocketv4*>>(new std::mutex(), std::vector<TCPAsyncClientSocketv4*>());
145-
this->m_MyClassPtrs[this->m_ClientSocketHandle.get()] = std::vector<TCPAsyncClientSocket*>();
146-
this->m_MyClassPtrs[this->m_ClientSocketHandle.get()].push_back(this);
146+
if (this->m_MyClassPtrs.find(this->mySocketWorker) == this->m_MyClassPtrs.end()) {
147+
this->m_MyClassPtrs[this->mySocketWorker] = std::map<uv_tcp_t*, std::vector<TCPAsyncClientSocket*>>();
148+
}
149+
this->m_MyClassPtrs[this->mySocketWorker][this->m_ClientSocketHandle.get()] = std::vector<TCPAsyncClientSocket*>();
150+
this->m_MyClassPtrs[this->mySocketWorker][this->m_ClientSocketHandle.get()].push_back(this);
147151

148152
if (this->mySocketWorker->m_num_Client == 0) {
149153
uv_loop_init(this->mySocketWorker->m_uv_loop.get());
@@ -159,6 +163,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::Connect()
159163
this->Init();
160164
}
161165
uv_connect_t *myReadReq = (uv_connect_t*) malloc(sizeof(uv_connect_t));
166+
myReadReq->data = (void*)this->mySocketWorker;
162167
sockaddr myAddress = this->m_remoteAddr.getIPAddress();
163168
uv_tcp_connect(myReadReq, this->m_ClientSocketHandle.get(), &myAddress, EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_connect_cb);
164169
}
@@ -197,6 +202,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::SendMsg(const std
197202
}
198203
uv_write_t* myWriteRequest = (uv_write_t*) malloc(sizeof(uv_write_t));
199204
uv_buf_t myWriteBuf;
205+
myWriteRequest->data = (void*)this->mySocketWorker;
200206

201207
char* myBufSpace = new char[Msg.length() + 1];
202208
for (unsigned int i = 0; i < Msg.length(); i++) {
@@ -229,7 +235,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::Destroy()
229235
std::this_thread::sleep_for(std::chrono::duration<int, std::milli>(200));
230236
}
231237
this->Inited = false;
232-
std::vector<TCPAsyncClientSocket*> &MyVector = m_MyClassPtrs[this->m_ClientSocketHandle.get()];
238+
std::vector<TCPAsyncClientSocket*> &MyVector = m_MyClassPtrs[this->mySocketWorker][this->m_ClientSocketHandle.get()];
233239

234240
if (!MyVector.empty()) {
235241
for (auto MyIt = MyVector.begin(); MyIt != MyVector.end(); MyIt++) {
@@ -242,9 +248,12 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::Destroy()
242248
if (MyVector.empty()) {
243249
this->Disconnect();
244250
this->sharedMutex.lock();
245-
this->m_MyClassPtrs.erase(this->m_ClientSocketHandle.get());
251+
this->m_MyClassPtrs[this->mySocketWorker].erase(this->m_ClientSocketHandle.get());
246252
this->sharedMutex.unlock();
247253
}
254+
if (this->m_MyClassPtrs[this->mySocketWorker].empty()) {
255+
this->m_MyClassPtrs.erase(this->mySocketWorker);
256+
}
248257
this->m_ClientSocketHandle.reset();
249258
this->mySocketWorker->m_num_Client--;
250259
if (this->mySocketWorker->m_num_Client == 0) {

0 commit comments

Comments
 (0)