Пример #1
0
CLStatus CLLogger::WriteMsgAndErrcodeToFile(const char* pstrMsg, const char* pstrErrcode) {
	if(m_nUsedBytesForBuffer != 0) {
		if(write(m_fd, m_pLogBuffer, m_nUsedBytesForBuffer) == -1)
			return CLStatus(-1,0);
		m_nUsedBytesForBuffer = 0;
	}

	if(write(m_fd, pstrMsg, strlen(pstrMsg)) == -1)
		return CLStatus(-1,0);
	if(write(m_fd, pstrErrcode, strlen(pstrErrcode)) == -1)
		return CLStatus(-1,0);
	return CLStatus(0,0);
}
Пример #2
0
CLStatus CLConditionVariable::WakeupAll()
{
	int r = pthread_cond_broadcast(m_pConditionVariable);
	if(r != 0)
	{
		CLLogger::WriteLogMsg("In CLConditionVariable::WakeupAll, pthread_cond_broadcast error", r);
		return CLStatus(-1, 0);
	}
	else
	{
		return CLStatus(0, 0);
	}
}
Пример #3
0
CLStatus CLThread::Run(void *pContext)
{	
	m_pContext = pContext;

	int r = pthread_create(&m_ThreadID, 0, StartFunctionOfThread, this);
	if(r != 0)
	{
		CLLogger::WriteLogMsg("In CLThread::Run(), pthread_create error", r);
		return CLStatus(-1, 0);
	}

	return CLStatus(0, 0);
}
Пример #4
0
CLStatus CLConditionVariable::Wakeup()
{
	int r = pthread_cond_signal(m_pConditionVariable);
	if(r != 0)
	{
		CLLogger::WriteLogMsg("In CLConditionVariable::Wakeup, pthread_cond_signal error", r);
		return CLStatus(-1, 0);
	}
	else
	{
		return CLStatus(0, 0);
	}
}
Пример #5
0
CLStatus CLLogger::writeLog(const char *msg, long errorCode){
	if(msg == 0)
		return CLStatus(-1,0);
	
	if(strlen(msg) == 0)
		return CLStatus(-1,0);
	
	if(fileFd == -1)
		return CLStatus(-1,0);
	
	//带缓冲区的日志类代码实现
	unsigned int nLeftRoom = BUFFER_SIZE_LOG_FILE - usedByteForBuffer;

	unsigned int lengthOfMsg = strlen(msg);

	char buf[MAX_LINE];
	snprintf(buf,MAX_LINE," Error code:%d\r\n",errorCode);
	unsigned int lengthOfCode = strlen(buf);

	unsigned int totalLen = lengthOfMsg + lengthOfCode;
	if(totalLen > BUFFER_SIZE_LOG_FILE){
		CLStatus s = flush();
		if(!s.isSuccess())
			return CLStatus(-1,0);
	
		ssize_t r = write(fileFd,msg,lengthOfMsg);
		if(r == -1)
			return CLStatus(-1,errno);

		r = write(fileFd,buf,lengthOfCode);
		if(r == -1)
			return CLStatus(-1,errno);
	}

	if(totalLen > nLeftRoom){
		CLStatus s = flush();
		if(!s.isSuccess())
			return CLStatus(-1,0);
	}

	memcpy(logBuffer + usedByteForBuffer,msg,lengthOfMsg);
	usedByteForBuffer += lengthOfMsg;
	memcpy(logBuffer + usedByteForBuffer,buf,lengthOfCode);
	usedByteForBuffer += lengthOfCode;

	/*不带缓冲区的日志类代码实现。
	 * ssize_t n = write(fileFd,msg,strlen(msg));
	if(n < 0)
		return CLStatus(-1,errno);
	
	char buf[MAX_LINE];
	snprintf(buf,MAX_LINE," Error code:%d\r\n",errorCode);

	n = write(fileFd, buf, strlen(buf));
	if(n < 0){
		return CLStatus(-1,errno);
	}*/

	return CLStatus(0,0);
}
Пример #6
0
CLStatus CLListenAgent::receiveData(){
    socklen_t clientLen;
    int clientFd;

    clientFd = accept( listenFd, (struct sockaddr*)&clientAddr, &clientLen );
    if(clientFd < 0){
        CLLogger::writeLogMessage( "CLListen:: receiveData accept error!\n",errno );
        return CLStatus( FAILED,errno );
    }
    
    CLAgent *jobAgent = new CLJobAgent(clientFd);
    CLEpoll::getInstance() -> doEvent(jobAgent,clientFd,EPOLL_CTL_ADD,EPOLLIN);

    return CLStatus( SUCCESSFUL,0 );
}
	CLStatus On_1(CLMessage *pm)
	{
		CLMsg1ForCLNonThreadForMsgLoop *p = dynamic_cast<CLMsg1ForCLNonThreadForMsgLoop*>(pm);
		EXPECT_TRUE(p != 0);

		g_for_on1++;

		if(g_for_on1 == count)
		{
			pthread->WaitForDeath();
			return CLStatus(QUIT_MESSAGE_LOOP, 0);
		}
		else
			return CLStatus(0, 0);
	}
CLStatus CLMsgLoopManagerForPipeQueue::Uninitialize()
{
	CLPrivateMsgQueuebyNamedPipe *pQueue = dynamic_cast<CLPrivateMsgQueuebyNamedPipe *>(m_pMsgQueue);
	if(pQueue == 0)
		return CLStatus(0, 0);

	CLExecutiveNameServer *pNameServer = CLExecutiveNameServer::GetInstance();
	if(pNameServer == 0)
	{
		CLLogger::WriteLogMsg("In CLMsgLoopManagerForPipeQueue::Uninitialize(), CLExecutiveNameServer::GetInstance error", 0);
		return CLStatus(-1, 0);
	}

	return pNameServer->ReleaseCommunicationPtr(m_strThreadName.c_str());
}
CLStatus CLMessageLoopManager::DispatchMessage(CLMessage* pMessage)
{
	std::map<unsigned long,CallBackForMessageLoop>::iterator iter;
	iter = m_MsgMappingTable.find(pMessage->m_clMsgID);
	if(iter == m_MsgMappingTable.end())
	{
		CLLogger::WriteLogMesg("In CLMessageLoopManager::DispatchMessage(), it == m_MsgMappingTable.end", 0);
		return CLStatus(-1, 0);
	}
	CallBackForMessageLoop pFunction = iter->second;
	if(pFunction != 0)
		return (m_pMessageOberver->*pFunction)(pMessage);
	else
		return CLStatus(-1,0);
}
Пример #10
0
CLStatus CLLogger::WriteLog(const char *pstrMsg, long lErrorCode)
{
	if(pstrMsg == 0)
		return CLStatus(-1, 0);

	if(strlen(pstrMsg) == 0)
		return CLStatus(-1, 0);

	if(m_pLogBuffer == 0)
		return CLStatus(-1, 0);
	
	unsigned int nleftroom = BUFFER_SIZE_LOG_FILE - m_nUsedBytesForBuffer;

	unsigned int len_strmsg = strlen(pstrMsg);

	char buf[MAX_SIZE];
	snprintf(buf, MAX_SIZE, "	Error code: %ld\r\n",  lErrorCode);
	unsigned int len_code = strlen(buf);

	unsigned int total_len = len_code + len_strmsg;
	if(total_len > BUFFER_SIZE_LOG_FILE)
	{
		if(m_Fd == -1)
			return CLStatus(-1, 0);

		ssize_t r = write(m_Fd, pstrMsg, len_strmsg);
		if(r == -1)
			return CLStatus(-1, errno);

		r = write(m_Fd, buf, len_code);
		if(r == -1)
			return CLStatus(-1, errno);

		return CLStatus(0, 0);
	}

	if(total_len > nleftroom)
	{
		CLStatus s = Flush();
		if(!s.IsSuccess())
			return CLStatus(-1, 0);
	}

	memcpy(m_pLogBuffer + m_nUsedBytesForBuffer, pstrMsg, len_strmsg);

	m_nUsedBytesForBuffer += len_strmsg;

	memcpy(m_pLogBuffer + m_nUsedBytesForBuffer, buf, len_code);

	m_nUsedBytesForBuffer += len_code;
	
	return CLStatus(0, 0);
}
    virtual CLStatus Initialize(CLMessageLoopManager *pMessageLoop, void* pContext)
    {
        pMessageLoop->Register(1, (CallBackForMessageLoop)(&CLObserverTesterForCLMsgLoopManagerForShareNamedPipe::On_1));
        pMessageLoop->Register(2, (CallBackForMessageLoop)(&CLObserverTesterForCLMsgLoopManagerForShareNamedPipe::On_2));

        return CLStatus(0, 0);
    }
Пример #12
0
CLStatus CLConditionVariable::Wait(CLMutex *pMutex)
{
	if(pMutex == NULL)
		return CLStatus(-1, 0);
	
	int r = pthread_cond_wait(&m_ConditionVariable, pMutex->m_pMutex);
	if(r != 0)
	{
		CLLogger::WriteLogMsg("In CLConditionVariable::Wait, pthread_cond_wait error", r);
		return CLStatus(-1, 0);
	}
	else
	{
		return CLStatus(0, 0);
	}
}
	CLStatus On_2(CLMessage *pm)
	{
		CLMsg2ForCLNonThreadForMsgLoopTest *p = dynamic_cast<CLMsg2ForCLNonThreadForMsgLoopTest*>(pm);
		EXPECT_TRUE(p != 0);

		return CLStatus(QUIT_MESSAGE_LOOP, 0);
	}
CLStatus CLThreadForMsgLoop::Ready(CLMessageObserver *pMsgObserver, const char *pstrThreadName,int ExecutiveType)
{
	m_pCoordinator = new CLRegularCoordinator();
	CLMessageLoopManager* pM;
	if(ExecutiveType == EXECUTIVE_IN_PROCESS_USE_STL_QUEUE)
	{
		pM = new CLMsgLoopManagerForSTLqueue(pMsgObserver,pstrThreadName);
	}
	else if(ExecutiveType == EXECUTIVE_IN_PROCESS_USE_PIPE_QUEUE)
	{
		m_pPipeMsgQueue = new CLMsgLoopManagerForPipeQueue(pMsgObserver,pstrThreadName,PIPE_QUEUE_IN_PROCESS);
		pM = m_pPipeMsgQueue;
	}
	else if(ExecutiveType == EXECUTIVE_BETWEEN_PROCESS_USE_PIPE_QUEUE)
	{
		m_pPipeMsgQueue = new CLMsgLoopManagerForPipeQueue(pMsgObserver,pstrThreadName,PIPE_QUEUE_BETWEEN_PROCESS);
		pM = m_pPipeMsgQueue;
	}
	else
		throw "In CLThreadForMsgLoop::Ready(), ExecutiveType error.";

	CLExecutiveFunctionForMsgLoop *myadder = new CLExecutiveFunctionForMsgLoop(pM);
	CLThread *pThread= new CLThread(m_pCoordinator, m_bWaitForDeath);
	m_pCoordinator->SetExecObjects(pThread,myadder);
	return CLStatus(0,0);
}
Пример #15
0
CLStatus CLThread::WaitForDeath()
{
	if(!m_bThreadCreated)
		return CLStatus(-1,0);

	if(!m_bWaitForDeath)
		return CLStatus(-1,0);

	int r = pthread_join(m_ThreadID,0);
	if(0 != r){
		CLLogger::WriteLogMesg("In CLThread::WaitForDeath(), pthread_join error", r);
		return CLStatus(-1,0);
	}
	//delete this;
	return CLStatus(0,0);
}
    virtual CLStatus Deserialize(CLIOVectors& IOVectors, CLMessage **ppMsg, CLBufferManager& BufferManager)
    {
        CLIteratorForIOVectors iter;
        IOVectors.GetIterator(0, iter);

        int len = 0;
        EXPECT_TRUE(IOVectors.ReadBlock(iter, (char *)(&len), 4).IsSuccess());
        EXPECT_EQ(len, 16);

        long id = 0;
        EXPECT_TRUE(IOVectors.ReadBlock(iter, (char *)(&id), 8).IsSuccess());
        EXPECT_EQ(id, 1);

        int x = 0;
        EXPECT_TRUE(IOVectors.ReadBlock(iter, (char *)(&x), 4).IsSuccess());
        EXPECT_EQ(x, 2);

        int y = 0;
        EXPECT_TRUE(IOVectors.ReadBlock(iter, (char *)(&y), 4).IsSuccess());
        EXPECT_EQ(y, 3);

        *ppMsg = new CLMsg1ForCLMsgLoopManagerForShareNamedPipeTest();

        return CLStatus(0, 0);
    }
Пример #17
0
CLStatus CLNonThreadForMsgLoop::RegisterDeserializer(unsigned long lMsgID, CLMessageDeserializer *pDeserializer)
{
	if(m_pPipeMsgQueue != NULL)
		return m_pPipeMsgQueue->RegisterDeserializer(lMsgID, pDeserializer);

	return CLStatus(-1, 0);
}
Пример #18
0
CLStatus CLConditionVariable::Wait(CLMutex *pMutex)
{
	if(pMutex == NULL)
		return CLStatus(-1, 0);
	
	int r = pthread_cond_wait(&m_ConditionVariable, ((CLMutexByPThread *)(pMutex->GetMutexInterface()))->GetMutexPointer());
	if(r != 0)
	{
		CLLogger::WriteLogMsg("In CLConditionVariable::Wait, pthread_cond_wait error", r);
		return CLStatus(-1, 0);
	}
	else
	{
		return CLStatus(0, 0);
	}
}
Пример #19
0
CLStatus CLMessageQueueBySTLqueue::Push(CLMessage * pMessage)
{
	try
	{
		CLCriticalSection cs(&m_Mutex);

		m_MessageQueue.push(pMessage);
	}
	catch(const char* str)
	{
		CLLogger::WriteLogMsg("In CLMessageQueue::Push(), exception arise", 0);
		return CLStatus(-1, 0);
	}

	return CLStatus(0, 0);
}
CLStatus CLMutexByRecordLockingAndPThread::Unlock()
{
	if(!m_ProcessMutex.Unlock().IsSuccess())
	{
		CLLogger::WriteLogMsg("In CLMutexByRecordLockingAndPThread::Lock(), m_ProcessMutex.Unlock error", 0);
		return CLStatus(-1, 0);
	}

	if(!m_ThreadMutex.Unlock().IsSuccess())
	{
		CLLogger::WriteLogMsg("In CLMutexByRecordLockingAndPThread::Lock(), m_ThreadMutex.Unlock error", 0);
		return CLStatus(-1, 0);
	}

	return CLStatus(0, 0);
}
Пример #21
0
CLStatus CLMessageLoopManager::EnterMessageLoop(void *pContext)
{
	CLStatus s = Initialize();
	if(!s.IsSuccess())
	{
		CLLogger::WriteLogMsg("In CLMessageLoopManager::EnterMessageLoop(), Initialize error", 0);
		return CLStatus(-1, 0);
	}

	CLStatus s1 = m_pMessageObserver->Initialize(this, pContext);
	if(!s1.IsSuccess())
	{
		CLLogger::WriteLogMsg("In CLMessageLoopManager::EnterMessageLoop(), m_pMessageObserver->Initialize error", 0);

		CLStatus s2 = Uninitialize();
		if(!s2.IsSuccess())
			CLLogger::WriteLogMsg("In CLMessageLoopManager::EnterMessageLoop(), Uninitialize() error", 0);	

		return CLStatus(-1, 0);
	}
	
	while(true)
	{
		CLMessage *pMsg = WaitForMessage();
		if(pMsg == 0)
		{
			CLLogger::WriteLogMsg("In CLMessageLoopManager::EnterMessageLoop(), pMsg == 0", 0);
			continue;
		}
		
		CLStatus s3 = DispatchMessage(pMsg);

		delete pMsg;

		if(s3.m_clReturnCode == QUIT_MESSAGE_LOOP)
			break;
	}

	CLStatus s4 = Uninitialize();
	if(!s4.IsSuccess())
	{
		CLLogger::WriteLogMsg("In CLMessageLoopManager::EnterMessageLoop(), Uninitialize() error", 0);
		return CLStatus(-1, 0);
	}

	return CLStatus(0, 0);
}
Пример #22
0
CLStatus CLSharedEventAllocator::Release(const char *pstrEventName)
{
	CLSharedEventAllocator *p = CLSharedEventAllocator::GetInstance();
	if(p == 0)
		return CLStatus(-1, 0);

	return p->ReleaseEventInfo(pstrEventName);
}
CLStatus CLMsgLoopManagerForPipeQueue::RegisterDeserializer(unsigned long lMsgID, CLMessageDeserializer *pDeserializer)
{
	CLSharedMsgQueueByNamedPipe *pQueue = dynamic_cast<CLSharedMsgQueueByNamedPipe *>(m_pMsgQueue);
	if(pQueue != 0)
		return pQueue->RegisterDeserializer(lMsgID, pDeserializer);
	else
		return CLStatus(-1, 0);
}
CLStatus CLSharedMsgQueueByNamedPipe::RegisterDeserializer(unsigned long lMsgID, CLMessageDeserializer *pDeserializer)
{
    if(pDeserializer == 0)
        return CLStatus(-1, 0);

    map<unsigned long, CLMessageDeserializer*>::iterator it = m_DeserializerTable.find(lMsgID);
    if(it != m_DeserializerTable.end())
    {
        delete pDeserializer;
        CLLogger::WriteLogMsg("In CLMessageQueueByNamedPipe::RegisterDeserializer(), m_DeserializerTable.find error", 0);
        return CLStatus(-1, 0);
    }

    m_DeserializerTable[lMsgID] = pDeserializer;

    return CLStatus(0, 0);
}
CLStatus CLSharedExecutiveCommunicationByNamedPipe::RegisterSerializer(unsigned long lMsgID, CLMessageSerializer *pSerializer)
{
	if(pSerializer == 0)
		return CLStatus(-1, 0);

	map<unsigned long, CLMessageSerializer*>::iterator it = m_SerializerTable.find(lMsgID);
	if(it != m_SerializerTable.end())
	{
		delete pSerializer;
		CLLogger::WriteLogMsg("In CLSharedExecutiveCommunicationByNamedPipe::RegisterSerializer(), m_SerializerTable.find error", 0);
		return CLStatus(-1, 0);
	}

	m_SerializerTable[lMsgID] = pSerializer;

	return CLStatus(0, 0);
}
Пример #26
0
CLStatus CLSharedEventAllocator::Create()
{
	if(m_pAllocator == 0)
	{
		try
		{
			m_pAllocator = new CLSharedEventAllocator();
		}
		catch(const char *str)
		{
			CLLogger::WriteLogMsg(str, 0);
			return CLStatus(-1, 0);
		}
	}

	return CLStatus(0, 0);
}
Пример #27
0
CLStatus CLLogger::flush(){
	if(fileFd == -1)
		return CLStatus(-1,0);
	
	if(logBuffer == 0)
		return CLStatus(-1,0);
	
	if(usedByteForBuffer == 0)
		return CLStatus(0,0);
	
	ssize_t r = write(fileFd,logBuffer,usedByteForBuffer);
	if(r == -1)
		return CLStatus(-1,errno);
	
	usedByteForBuffer = 0;	
	return CLStatus(-1,0);
}
CLStatus CLConditionVariable::WakeupAll()
{
	if(pthread_cond_broadcast(m_pConditionVariable)){
		throw "In CLConditionVariable::WakeupAll(),pthread_cond_broadcast() error.";
		CLLogger::WriteLogMesg("In CLConditionVariable::WakeupAll(),pthread_cond_broadcast() error.",0);
	}
	return CLStatus(0,0);
}
Пример #29
0
CLStatus CLLogger::flush() {
	
	if(pthread_mutex_lock(m_pMutexForWriteLog) != 0)
		return CLStatus(-1,0);

	try{
		if(m_fd == -1)
			throw CLStatus(-1,0);
		if(m_pLogBuffer == NULL) 
			throw CLStatus(-1,0);
		if(m_nUsedBytesForBuffer == 0)
			throw CLStatus(0,0);
		ssize_t r = write(m_fd, m_pLogBuffer, m_nUsedBytesForBuffer);

		if(r == -1)
			throw CLStatus(-1, errno);
		m_nUsedBytesForBuffer = 0;
		throw CLStatus(0,0);
	}

	catch(CLStatus &s) {
		if(pthread_mutex_unlock(m_pMutexForWriteLog) != 0)
			return CLStatus(-1,0);
		return s;
	}
}
	CLStatus On_2(CLMessage *pm)
	{
		CLMsg2ForCLThreadForMsgLoop *p = dynamic_cast<CLMsg2ForCLThreadForMsgLoop*>(pm);
		EXPECT_TRUE(p != 0);

		g_for_on2++;

		return CLStatus(QUIT_MESSAGE_LOOP, 0);
	}