int CAppCtrl::RecvData(unsigned int uiDPKey, CBuffer& stBuff) { //找到key对应的管道 PCShmQ pstShm = GetShm(uiDPKey); if(pstShm == NULL) { SL_ERROR("shm %u fand fails!", uiDPKey); return -1; } else if(!pstShm->HasCode()) { //管道里没有数据 return 0; } m_Stat.Put(app_stat_recvpkg); stBuff.Clear(); int iCodeLen = 0; //从管道里取出一个code int iRet = pstShm->GetOneCode(stBuff.GetFreeBuf(), stBuff.GetFreeLen(), iCodeLen); if(iRet || iCodeLen < (int)sizeof(CNetHead)) { SL_ERROR("get one code but data fails (ret: %d, clen:%d)",iRet, iCodeLen); return -2; } stBuff.Append(iCodeLen); return iCodeLen; }
int CAppCtrl::SendToServer(int iSvrID, const char* pszBuf, int iBufLen) { if(iSvrID < 0 || iSvrID >= (int)SL_COUNTOF(m_SvrConnect) || pszBuf == NULL || iBufLen <= 0) { SL_ERROR("invalid param: svrid=%d, buf=%p, len=%d", iSvrID, pszBuf, iBufLen); return -1; } if(!m_SvrConnect[iSvrID].IsInited()) { SL_ERROR("invalid Param: svrid=%d, buf=%p, len=%d, svr not inited",iSvrID, pszBuf, iBufLen); return -1; } return m_SvrConnect[iSvrID].Send(pszBuf, iBufLen); }
int CAppCtrl::WorkInit() { ///停止主循环,待Init执行完毕后再执行主循环 m_InitFinish = false; //初始化数据缓冲区 m_stClientEncodeBuf.Attach(NULL, STREAM_BUFF_LENGTH, 0); m_stServerEncodeBuf.Attach(NULL, STREAM_BUFF_LENGTH, 0); m_stClientDecodeBuf.Attach(NULL, STREAM_BUFF_LENGTH, 0); ///初始化後台連接 int iRet = 0; bool NewServer = false; for (size_t i = 0; i < APP_CONF->SvrConnectInfo.size(); ++i) { CSvrConnectParam& stParam = APP_CONF->SvrConnectInfo[i]; if(stParam.Index < 0 || stParam.Index >= EMAX_SVRCONN_COUNT) { SL_ERROR("invalid svr index %d, must in[0~%d]", stParam.Index, EMAX_SVRCONN_COUNT); return -1; } iRet = m_SvrConnect[stParam.Index].Init(GetEpoll(), stParam); CHECK_RETURN(iRet); iRet = m_SvrConnect[stParam.Index].ConnectSvr(); CHECK_RETURN(iRet); } //加载业务so /*iRet = m_stSoLoader.LoadAppSo(APP_CONF->SoPath.c_str()); CHECK_RETURN(iRet); CAppSoInf* pstAppSo = m_stSoLoader.CreateAppSo(); if(pstAppSo == NULL) { return -1; }*/ //调用so的onInit //iRet = SL_APPSO->OnInitConfig(); CHECK_RETURN(iRet); SL_TRACE("appctrl init OnInitConfig"); ///内存预分配 iRet = InitAppBuffer(); CHECK_RETURN(iRet); SL_TRACE("appctrl init InitAppBuffer"); /*iRet = SL_APPSO->OnInitBuffer(); CHECK_RETURN(iRet); SL_TRACE("appctrl init OnInitBuffer");*/ iRet = m_stShmBuff.CreateBuff("key/appsvr.key"); CHECK_RETURN(iRet); SL_TRACE("appctrl init CreateBuff"); }
int CAppCtrl::LoadConfig() { int iRet = APP_CONF->LoadConfig(); if(iRet) { SL_ERROR("fail to load appconfig %d, iRet= %d!", APP_CONF_PATH, iRet); return iRet; } SL_INFO("Init NetShm Key = %s", APP_CONF->CodeStreamKey.c_str()); CDataPathPara stPara(EDPID_CLIENT, true, APP_CONF->CodeStreamKey.c_str(), APP_CONF->CodeStreamSize, APP_CONF->CodeFrontEndSocket.c_str(), APP_CONF->CodeBackEndSocket.c_str(), OnClientEvent); iRet = InsertDataPath(stPara); if(iRet) { SL_ERROR("fail InsetDataPath iRet= %d", iRet); return iRet; } return 0; }
int CAppCtrl::SendData(unsigned int uiDPKey, CNetHead& stHead, const char* pszBuf, int iBufLen) { m_Stat.Put(app_stat_sendpkg); PCShmQ pstShm = GetShm(uiDPKey); if(pstShm == NULL) { SL_ERROR("shm %u find fails!", uiDPKey); return -1; } if((stHead.m_LiveFlag & 0xFF) != 0) { SL_WARNING("nethead (handle=%u, handlereq=%u) liveflag=%d not online, but want send data", stHead.m_Handle, stHead.m_HandleSeq, stHead.m_LiveFlag); } stHead.m_iDataLength = iBufLen; int iRet = pstShm->PutOneCode((const char*)&stHead, sizeof(stHead), pszBuf, iBufLen); if(iRet) { SL_ERROR("put one code into shm fails(%d)!", iRet); } return iRet; }
slint_t mpi_merge2(elements_t *s, slint_t other_rank, slint_t high_rank, slint_t *dst_size, merge2x_f m2, elements_t *xs, int size, int rank, MPI_Comm comm) /* sl_proto, sl_func mpi_merge2 */ { const int tag = 1; slint_t ex_start, ex_sizes[2], nx_move, ex_size; elements_t s0, s1; MPI_Status status; #ifdef CHECK_ORDER slint_t check_order; #endif SL_TRACE_IF(MM2_TRACE_IF, "starting mpi_merge2"); /* sl_tid rti_tid_mpi_merge2 */ rti_treset(rti_tid_mpi_merge2_find); /* sl_tid */ rti_treset(rti_tid_mpi_merge2_moveright); /* sl_tid */ rti_treset(rti_tid_mpi_merge2_exchange); /* sl_tid */ rti_treset(rti_tid_mpi_merge2_moveleft); /* sl_tid */ rti_treset(rti_tid_mpi_merge2_local); /* sl_tid */ rti_tclear(rti_tid_mpi_merge2); if (other_rank < 0 || other_rank >= size) return -1; if (rank == other_rank) return 0; rti_tstart(rti_tid_mpi_merge2); #ifdef CHECK_ORDER check_order = elements_validate_order(s, 1); if (check_order) SL_ERROR("input order failed at %" slint_fmt "", check_order); #endif SL_TRACE_IF(MM2_TRACE_IF, "find_exact: s->size = %" slint_fmt ", other_rank / high_rank = %" slint_fmt " / %" slint_fmt, s->size, other_rank, high_rank); rti_tstart(rti_tid_mpi_merge2_find); mpi_find_exact(s, other_rank, high_rank, dst_size, &ex_start, ex_sizes, &nx_move, size, rank, comm); rti_tstop(rti_tid_mpi_merge2_find); SL_TRACE_IF(MM2_TRACE_IF, "find_exact: ex_start = %" slint_fmt ", ex_sizes = { %" slint_fmt ", %" slint_fmt " }, nx_move = %" slint_fmt, ex_start, ex_sizes[0], ex_sizes[1], nx_move); /* move the nx-block to the right (before exchange) */ rti_tstart(rti_tid_mpi_merge2_moveright); if (nx_move > 0 && s->size - ex_sizes[0] > 0) { SL_TRACE_IF(MM2_TRACE_IF, "moving right %" slint_fmt "", nx_move); if (rank != high_rank) elem_nmove_at(s, 0, s, nx_move, s->size - ex_sizes[0]); else elem_nmove_at(s, ex_sizes[0], s, ex_sizes[0] + nx_move, s->size - ex_sizes[0]); } rti_tstop(rti_tid_mpi_merge2_moveright); /* exchange elements */ rti_tstart(rti_tid_mpi_merge2_exchange); elem_assign_at(s, ex_start, &s0); ex_size = xmin(ex_sizes[0], ex_sizes[1]); if (ex_size > 0) { SL_TRACE_IF(MM2_TRACE_IF, "exchanging %" slint_fmt " elements at %" slint_fmt "", ex_size, ex_start); #ifdef MM2_ELEMENTS_SENDRECV_REPLACE mpi_elements_sendrecv_replace(&s0, ex_size, other_rank, tag, other_rank, tag, size, rank, comm); #else #define xelem_call \ MPI_Sendrecv_replace(xelem_buf(&s0), ex_size, xelem_mpi_datatype, other_rank, tag, other_rank, tag, comm, &status); #include "sl_xelem_call.h" #endif } elem_add(&s0, ex_size); if (ex_size < ex_sizes[0]) { ex_size = ex_sizes[0] - ex_size; SL_TRACE_IF(MM2_TRACE_IF, "sending %" slint_fmt " at %" slint_fmt "", ex_size, (slint_t) (s0.keys - s->keys)); #define xelem_call \ MPI_Send(xelem_buf(&s0), ex_size, xelem_mpi_datatype, other_rank, tag, comm); #include "sl_xelem_call.h" } else if (ex_size < ex_sizes[1]) { ex_size = ex_sizes[1] - ex_size; SL_TRACE_IF(MM2_TRACE_IF, "receiving %" slint_fmt " at %" slint_fmt "", ex_size, (slint_t) (s0.keys - s->keys)); #define xelem_call \ MPI_Recv(xelem_buf(&s0), ex_size, xelem_mpi_datatype, other_rank, tag, comm, &status); #include "sl_xelem_call.h" } rti_tstop(rti_tid_mpi_merge2_exchange); /* move the nx-block to the left (after exchange) */ rti_tstart(rti_tid_mpi_merge2_moveleft); if (nx_move < 0 && s->size - ex_sizes[0] > 0) { SL_TRACE_IF(MM2_TRACE_IF, "moving left %" slint_fmt "", nx_move); if (rank != high_rank) elem_nmove_at(s, 0, s, nx_move, s->size - ex_sizes[0]); else elem_nmove_at(s, ex_sizes[0], s, ex_sizes[0] + nx_move, s->size - ex_sizes[0]); } rti_tstop(rti_tid_mpi_merge2_moveleft); /* prepare the local merge2 */ if (rank != high_rank) { elem_assign_at(s, 0, &s0); s0.size = s->size - ex_sizes[0]; elem_assign_at(s, s0.size, &s1); s1.size = ex_sizes[1]; } else { elem_assign_at(s, 0, &s0); s0.size = ex_sizes[1]; elem_assign_at(s, s0.size, &s1); s1.size = s->size - ex_sizes[0]; } #ifdef CHECK_ORDER check_order = elements_validate_order(&s0, 1); if (check_order) SL_ERROR("intermediate lower order failed at %" slint_fmt "", check_order); check_order = elements_validate_order(&s1, 1); if (check_order) SL_ERROR("intermediate higher order failed at %" slint_fmt "", check_order); #endif s->size = s0.size + s1.size; /* local merge */ rti_tstart(rti_tid_mpi_merge2_local); if (s0.size > 0 && s1.size > 0 && m2 != NULL) { SL_TRACE_IF(MM2_TRACE_IF, "local merge2 %" slint_fmt " with %" slint_fmt "", s0.size, s1.size); m2(&s0, &s1, xs); } rti_tstop(rti_tid_mpi_merge2_local); #ifdef CHECK_ORDER check_order = elements_validate_order(s, 1); if (check_order) SL_ERROR("output order failed at %" slint_fmt "", check_order); #endif rti_tstop(rti_tid_mpi_merge2); #if defined(MM2_PRINT_TIMINGS) && defined(SL_USE_RTI_TIM) if (MM2_PRINT_TIMINGS) { printf("%d: mpi_merge2: %f\n", rank, rti_tlast(rti_tid_mpi_merge2)); printf("%d: mpi_merge2: find: %f\n", rank, rti_tlast(rti_tid_mpi_merge2_find)); printf("%d: mpi_merge2: move-right: %f\n", rank, rti_tlast(rti_tid_mpi_merge2_moveright)); printf("%d: mpi_merge2: exchange: %f\n", rank, rti_tlast(rti_tid_mpi_merge2_exchange)); printf("%d: mpi_merge2: move-left: %f\n", rank, rti_tlast(rti_tid_mpi_merge2_moveleft)); printf("%d: mpi_merge2: local: %f\n", rank, rti_tlast(rti_tid_mpi_merge2_local)); } #endif return 0; }