?? sharememory.cpp
字號:
+ (m_pBlockInfo->pAreaInfo + i)->ulItemNumber * sizeof(unsigned long) \ + k * (1 + (m_pBlockInfo->pAreaInfo + i)->ulItemNumber) * sizeof(unsigned long) ); // initialize start address of update array ((m_pBlockInfo->pAreaInfo + i)->pUpdateArrayInfo + k)->pUpdateArray = \ ((m_pBlockInfo->pAreaInfo + i)->pUpdateArrayInfo + k)->pCounter + 1; } */ } #ifndef DEBUG_SHM pTemp = NULL; #endif #ifdef DEBUG_SHM { if( (fp = fopen(gsLogFileName,"a+") ) == NULL) { printf("open %s failed!\n",gsLogFileName); exit(-1); } fprintf(fp,"<Read Initialize Information>\n"); fprintf(fp,"Share Memory Initialize Flag:%d\n",m_pBlockInfo->ucInitializeFlag); fprintf(fp,"Share Memory Key:%ld\n",m_pBlockInfo->ulShmKey); fprintf(fp,"Share Memory Size:%ld\n",m_pBlockInfo->ulShmTotalSize); fprintf(fp,"Semaphore Number:%d\n",m_pBlockInfo->uiSemTotalNumber); fprintf(fp,"Control Area Size:%ld\n",m_pBlockInfo->ulControlAreaSize); fprintf(fp,"Business Area Number:%d\n",m_pBlockInfo->uiBusinessAreaNumber); // output of business area information for(int i=0;i < m_pBlockInfo->uiBusinessAreaNumber;i++) { fprintf(fp,"\n<Business Area %d Information>\n",i); // output of area information fprintf(fp,"<Area Information>\n"); fprintf(fp,"Area ID:%d\n",(m_pBlockInfo->pAreaInfo + i)->uiAreaID); fprintf(fp,"Area Size:%ld\n",(m_pBlockInfo->pAreaInfo + i)->ulAreaSize); fprintf(fp,"Area Index Size:%ld\n",(m_pBlockInfo->pAreaInfo + i)->ulAreaIndexSize); fprintf(fp,"Data Item Size:%ld\n",(m_pBlockInfo->pAreaInfo + i)->ulItemSize); fprintf(fp,"Data Item Number:%ld\n",(m_pBlockInfo->pAreaInfo + i)->ulItemNumber); fprintf(fp,"Queue Number:%d\n",(m_pBlockInfo->pAreaInfo + i)->uiQueueNumber); /*fprintf(fp,"Update Array Number:%d\n",(m_pBlockInfo->pAreaInfo + i)->uiUpdateArrayNumber);*/ // output of queue information for(int j=0;j < (m_pBlockInfo->pAreaInfo + i)->uiQueueNumber;j++) { fprintf(fp,"<Queue %d Information>\n",j); fprintf(fp,"Queue ID:%d\n",((m_pBlockInfo->pAreaInfo + i)->pQueueInfo + j)->uiQueueID); fprintf(fp,"Front Concurrent:%d\n",((m_pBlockInfo->pAreaInfo + i)->pQueueInfo + j)->ucFrontConcurrent); fprintf(fp,"Front Semaphore:%d\n",((m_pBlockInfo->pAreaInfo + i)->pQueueInfo + j)->uiFrontSemNumber); fprintf(fp,"Rear Concurrent:%d\n",((m_pBlockInfo->pAreaInfo + i)->pQueueInfo + j)->ucRearConcurrent); fprintf(fp,"Rear Semaphore:%d\n",((m_pBlockInfo->pAreaInfo + i)->pQueueInfo + j)->uiRearSemNumber); fprintf(fp,"Front:%ld\n",*( ((m_pBlockInfo->pAreaInfo + i)->pQueueInfo + j)->pQueue->pFront ) ); fprintf(fp,"Rear:%ld\n",*( ((m_pBlockInfo->pAreaInfo + i)->pQueueInfo + j)->pQueue->pRear ) ); fprintf(fp,"MaxSize:%ld\n",((m_pBlockInfo->pAreaInfo + i)->pQueueInfo + j)->pQueue->ulMaxSize); fprintf(fp,"Queue Address:0x%0x\n",((m_pBlockInfo->pAreaInfo + i)->pQueueInfo + j)->pQueue->pQueue); } /* // output of update array information if((m_pBlockInfo->pAreaInfo + i)->uiUpdateArrayNumber > 0) fprintf(fp,"<Update Array Information>\n"); for(int j=0;j < (m_pBlockInfo->pAreaInfo + i)->uiUpdateArrayNumber;j++) { fprintf(fp,"Update Array %d\n",j); fprintf(fp,"Update Array ID:%d \n",((m_pBlockInfo->pAreaInfo + i)->pUpdateArrayInfo + j)->uiUpdateArrayID); fprintf(fp,"Counter:%ld\n",*( ((m_pBlockInfo->pAreaInfo + i)->pUpdateArrayInfo + j)->pCounter ) ); fprintf(fp,"Update Array Address:0x%0x\n",((m_pBlockInfo->pAreaInfo + i)->pUpdateArrayInfo + j)->pUpdateArray); }*/ } fclose(fp); } #endif } } /* // initialize business area config information of this program void C_ShareMemory::GetProgramConfig() { CConfigXml ShmConfig; char sName[XML_NAME_LEN]; char sValue[XML_VALUE_LEN]; string sTemp; ShmLog("GetProgramConfig"); if( !ShmConfig.Load(m_pConfigFileName) ) {ShmLog("34");throw C_SHMException(); } // get config value of read area number memset(sValue,0,XML_VALUE_LEN); memset(sName,0,XML_NAME_LEN); sprintf(sName,"ShareMemory.Program_%d.ReadAreaNumber",m_uiProgramFlag); ShmLog(sName); if( !ShmConfig.GetValue(sName,sTemp) ) {ShmLog("35");throw C_SHMException();} strcpy(sValue,sTemp.c_str()); m_uiReadAreaNumber = atoi(sValue); if(m_uiReadAreaNumber > 0) { // get config information of business area for this program to read m_pReadAreaInfo = (S_AreaInfo *) new \ char[ m_uiReadAreaNumber * sizeof(S_AreaInfo) ]; if(NULL == m_pReadAreaInfo) { {ShmLog("36");throw C_SHMException();} } memset(m_pReadAreaInfo,0, \ m_uiReadAreaNumber * sizeof(S_AreaInfo)); for(int i=0;i < m_uiReadAreaNumber;i++) { // get config value of business area ID // for this program to read memset(sValue,0,XML_VALUE_LEN); memset(sName,0,XML_NAME_LEN); sprintf(sName,"ShareMemory.Program_%d.ReadAreaID_%d", \ m_uiProgramFlag,i); if( !ShmConfig.GetValue(sName,sTemp) ) {ShmLog("37");throw C_SHMException();} strcpy(sValue,sTemp.c_str()); (m_pReadAreaInfo + i)->uiAreaID = atoi(sValue); // get business area config information from m_pBlockInfo // by area ID for(int j=0;j < m_pBlockInfo->uiBusinessAreaNumber;j++) { if( (m_pBlockInfo->pAreaInfo + j)->uiAreaID == (m_pReadAreaInfo + i)->uiAreaID ) memcpy((m_pReadAreaInfo + i), \ (m_pBlockInfo->pAreaInfo + j), \ sizeof(S_AreaInfo)); } } } else { m_uiReadAreaNumber = 0; m_pReadAreaInfo = NULL; } // get config value of write area number memset(sValue,0,XML_VALUE_LEN); memset(sName,0,XML_NAME_LEN); sprintf(sName,"ShareMemory.Program_%d.WriteAreaNumber",m_uiProgramFlag); if( !ShmConfig.GetValue(sName,sTemp) ) {ShmLog("38");throw C_SHMException();} strcpy(sValue,sTemp.c_str()); m_uiWriteAreaNumber = atoi(sValue); if(m_uiWriteAreaNumber > 0) { // get config information of business area for this program to read m_pWriteAreaInfo = (S_AreaInfo *) new \ char[ m_uiWriteAreaNumber * sizeof(S_AreaInfo) ]; if(NULL == m_pWriteAreaInfo) { {ShmLog("39");throw C_SHMException();} } memset(m_pWriteAreaInfo,0, \ m_uiWriteAreaNumber * sizeof(S_AreaInfo)); for(int i=0;i < m_uiWriteAreaNumber;i++) { // get config value of business area ID // for this program to write memset(sValue,0,XML_VALUE_LEN); memset(sName,0,XML_NAME_LEN); sprintf(sName,"ShareMemory.Program_%d.WriteAreaID_%d", \ m_uiProgramFlag,i); if( !ShmConfig.GetValue(sName,sTemp) ) {ShmLog("40");throw C_SHMException();} strcpy(sValue,sTemp.c_str()); (m_pWriteAreaInfo + i)->uiAreaID = atoi(sValue); // get business area config information from m_pBlockInfo // by area ID for(int j=0;j < m_pBlockInfo->uiBusinessAreaNumber;j++) { if( (m_pBlockInfo->pAreaInfo + j)->uiAreaID == (m_pWriteAreaInfo + i)->uiAreaID ) memcpy((m_pWriteAreaInfo + i), \ (m_pBlockInfo->pAreaInfo + j), \ sizeof(S_AreaInfo)); } } } else { m_uiWriteAreaNumber = 0; m_pWriteAreaInfo = NULL; } } */ // initialize config information of the specified business area void C_ShareMemory::GetOperateAreaConfig() { m_pOperateAreaInfo = (S_AreaInfo *) new char[ sizeof(S_AreaInfo) ]; if(NULL == m_pOperateAreaInfo) { { ShmLog("40_"); throw C_SHMException(); } } int i=0; for(i;i < m_pBlockInfo->uiBusinessAreaNumber;i++) { if(m_uiOperateAreaFlag == (m_pBlockInfo->pAreaInfo + i)->uiAreaID) { memcpy(m_pOperateAreaInfo,(m_pBlockInfo->pAreaInfo + i),sizeof(S_AreaInfo)); break; } } // verify business area flag if(i == m_pBlockInfo->uiBusinessAreaNumber) { { ShmLog("operate area flag is not config!"); throw C_SHMException(); } } } /* // operate semaphore, operation flag = 1 is lock, otherwise -1 is unlock void C_ShareMemory::OperateSem(const unsigned int uiSemNumber,const char cFlag) { struct sembuf suSemBuffer; if(1 == cFlag) { memset(&suSemBuffer,0,sizeof(sembuf)); suSemBuffer.sem_num = uiSemNumber; suSemBuffer.sem_op = 0; suSemBuffer.sem_flg = SEM_UNDO; semop(m_iSemID,&suSemBuffer,1); #ifdef DEBUG_SHM { if( (fp = fopen(gsLogFileName,"a+") ) == NULL) { printf("open %s failed!\n",gsLogFileName); exit(-1); } fprintf(fp,"semnum [%d] op [%d] \n",uiSemNumber,0); fclose(fp); } #endif } memset(&suSemBuffer,0,sizeof(sembuf)); suSemBuffer.sem_num = uiSemNumber; suSemBuffer.sem_op = cFlag; suSemBuffer.sem_flg = SEM_UNDO; semop(m_iSemID,&suSemBuffer,1); #ifdef DEBUG_SHM { if( (fp = fopen(gsLogFileName,"a+") ) == NULL) { printf("open %s failed!\n",gsLogFileName); exit(-1); } fprintf(fp,"semnum [%d] op [%d] \n",uiSemNumber,cFlag); fclose(fp); } #endif } } */ /* private function for the C_ShareMemory class ====end====================*/ /* public service interface for the C_ShareMemory class ====start===========*/ // constructor,load share memory block // and initialize share memory config information C_ShareMemory::C_ShareMemory(const char *pConfigFileName, \ const unsigned int uiProgramFlag,const unsigned int uiOperateAreaFlag) // process exception try { // function C_ShareMemory() // initial flag unsigned char ucInitialFlag = 0; // get config file name if(NULL == pConfigFileName) { ShmLog("1"); throw C_SHMException(); } m_pConfigFileName = new char[strlen(pConfigFileName) + 1]; if(NULL == m_pConfigFileName) { ShmLog("2"); throw C_SHMException(); } memset(m_pConfigFileName,0,strlen(pConfigFileName) + 1); strcpy(m_pConfigFileName,pConfigFileName); // get this program flag m_uiProgramFlag = uiProgramFlag; m_uiOperateAreaFlag = uiOperateAreaFlag; // get log file name GetLogFileName(uiProgramFlag); // get ShareMemoryID and SemaphoreSetID, // if not exist, creat it and set iInitFlag = 1 GetShmSemID(ucInitialFlag); // load share memory block m_pBlockStartAddress = (char *) shmat(m_iShmID,0,0); if( (char *)-1 == m_pBlockStartAddress ) { ShmLog("3"); throw C_SHMException(); } #ifdef DEBUG_SHM if( (fp = fopen(gsLogFileName,"a+") ) == NULL) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -