- 論壇徽章:
- 1
|
- void TServer::ReadEvent(Conn *pcon)
- {
- if(pcon->is_down==1||pcon->m_Engine==NULL)return;
- char *p_cmd;
- int res;
- while ((res = pcon->m_Engine->ReadPack(&p_cmd))>0)
- {
- S_CON_INFO s_info;
- s_info.pcon= pcon;
- s_info.run_code = 1;
- s_info.fd=pcon->GetFd();
- //讀取句柄消息
- s_info.data_buf = new char[res+1];
- memcpy(s_info.data_buf, p_cmd, res+1);
- s_info.data_buf_len=res;
- int tid = rand()%m_ThreadCount;
- if(write(m_pThreadInfo[tid].m_notifySendFd, &s_info, sizeof(S_CON_INFO))==-1){
- printf("管道寫入錯誤====pid:%d\n",tid);
- }
- }
- }
復制代碼 這里s_info.data_buf = new char[res+1]; 不斷new內(nèi)存,管道另一邊就得不斷delete內(nèi)存,是不是很浪費?有沒有更好的辦法
ReadEvent函數(shù)是libevent句柄觸發(fā)的,只要有句柄有消息,就會調(diào)用,while ((res = pcon->m_Engine->ReadPack(&p_cmd))>0)主要負責將這個句柄的消息按照分包原則每個包讀取出來,然后通過管道,向線程池哪里發(fā)送數(shù)據(jù),線程池收到管道數(shù)據(jù)后,先拷貝數(shù)據(jù),然后刪除發(fā)送管道這邊的內(nèi)存,在繼續(xù)處理數(shù)據(jù)羅輯部分。 |
|