Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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");

}
Пример #4
0
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;
}
Пример #5
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;
}
Пример #6
0
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;
}