예제 #1
0
파일: Bitmap.cpp 프로젝트: yafngzh/easyMq
ssize_t CBitmap::_SetBit(size_t unBitPos,ssize_t iBitVal)
{
	ssize_t iBitOldVal = 0;
	for (ssize_t i=0; i<(ssize_t)m_pHeadInfo->m_unBitWords; i++)
	{
		ssize_t iMask = (ssize_t)pow(2,(double)i);
		
		if(iBitVal & iMask)
		{
			if(0!=_SetBit(m_pBitMem[i],unBitPos))
				iBitOldVal |= iMask;
		}
		else
		{
			if(0==_ClearBit(m_pBitMem[i],unBitPos))
				iBitOldVal |= iMask;
		}	
	}

	//无改变
    	if (iBitOldVal == iBitVal)
    	{
    		return -2;
    	}
		
	m_pHeadInfo->m_unValStat[iBitOldVal]--;
	m_pHeadInfo->m_unValStat[iBitVal]++;
	
	return 0;
}
예제 #2
0
파일: Bitmap.cpp 프로젝트: yafngzh/easyMq
ssize_t CBitmap::StartUp()
{
	//非新建的共享内存,不用恢复
	if (m_iInitType!=emInit)
	{
		return 0;
	}

	if (access(m_szDumpFile, F_OK) == 0)
	{
		//恢复core
		ssize_t iRet = _CoreRecover();
		if (iRet < 0)
		{
			printf("Recover from dumpfile(%s) failed, ret %lld.\n",m_szDumpFile,(long long)iRet);
			return iRet;
		}
		printf("Recover from %d bytes from dumpfile.\n",iRet);
	}
	else
	{
		printf("no dumpfile to recover.\n");
	}

	ssize_t iOp = 0;	
	ssize_t iCount = 0;
	ssize_t iLogLen = 0;
	char m_szBuffer[1024];
	u_int64_t tLogTime;
	
	//恢复日志流水
	m_stBinLog.ReadRecordStart();
	while(0<(iLogLen = m_stBinLog.ReadRecordFromBinLog(m_szBuffer,sizeof(m_szBuffer),tLogTime)))
	{
		size_t unUin = 0;
		ssize_t iBuffPos = 0;
		
		memcpy(&iOp,m_szBuffer,sizeof(ssize_t));
		iBuffPos += sizeof(ssize_t);

		if  (iOp == op_set)
		{
			memcpy(&unUin,m_szBuffer+iBuffPos,sizeof(ssize_t));
			iBuffPos += sizeof(ssize_t);

			ssize_t iVal = 0;
			memcpy(&iVal,m_szBuffer+iBuffPos,sizeof(ssize_t));
			iBuffPos += sizeof(ssize_t);
			
			_SetBit(unUin,iVal);			
		}
		
		iCount++;
	}

	printf("recover from binlog %lld records.\n",(long long)iCount);
	return 0;
}
예제 #3
0
// public functions
int FastGpioOmega::SetDirection(int pinNum, int bOutput)
{
	unsigned long int regVal;

	// read the current input and output settings
	regVal = _ReadReg(REGISTER_OE_OFFSET);
	if (verbosityLevel > 0) printf("Direction setting read: 0x%08lx\n", regVal);

	// set the OE for this pin
	_SetBit(regVal, pinNum, bOutput);
	if (verbosityLevel > 0) printf("Direction setting write: 0x%08lx\n", regVal);

	// write the new register value
	_WriteReg(REGISTER_OE_OFFSET, regVal);


	return (EXIT_SUCCESS);
}
예제 #4
0
파일: Bitmap.cpp 프로젝트: yafngzh/easyMq
ssize_t CBitmap::SetBit(size_t unBitPos,ssize_t iBitVal)
{
	size_t unBytePos = (ssize_t)(unBitPos/8.0f);		
	if (unBytePos >= m_unMapSize)
		return -1;
	
	if((iBitVal < 0) || 
		(iBitVal >= (ssize_t)pow(2,(double)m_pHeadInfo->m_unBitWords)))
	{
		return -2;
	}
	
    	if (0!=_SetBit(unBitPos,iBitVal))
    	{
    		return -3;
    	}
		
	m_pHeadInfo->m_unDataFlag |= DF_DATA_DIRTY;
	
	if (m_iBinLogOpen)
	{
		char m_szBuffer[1024];
		
		ssize_t iOp = op_set;
		ssize_t iBuffLen = 0;
		
		memcpy(m_szBuffer,&iOp,sizeof(ssize_t));
		iBuffLen += sizeof(ssize_t);
		
		memcpy(m_szBuffer+iBuffLen,&unBitPos,sizeof(ssize_t));
		iBuffLen += sizeof(ssize_t);

		memcpy(m_szBuffer+iBuffLen,&iBitVal,sizeof(ssize_t));
		iBuffLen += sizeof(ssize_t);
		
		m_stBinLog.WriteToBinLog(m_szBuffer,iBuffLen);		
	}
	
	return 0;
}