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; }
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; }
// 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); }
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; }