📄 mainserv.c
字号:
break; case TYPE_OF_ICXX: break; case TYPE_OF_ZJXX: break; case TYPE_OF_SJXX: break; case TYPE_OF_BBXX: break; case TYPE_OF_FKXX: break; } }/* Automatically write the new record to the appropriate file */void AutoRecord( MESGTYPE mesgType){ int ret; FILE *fp; printf("Enter AutoRecord.\n"); switch( mesgType ) { case TYPE_OF_DWXX: //If there is no temp file in current directory,we can record it to main file directly if( TempStore( TYPE_OF_DWXX, QUERY ) == 0 ) { //try to lock the mutex printf("Enter tryLock.\n"); if( (ret=Pthread_mutex_trylock( &fLock.DW_FLOCK)) == 0 ) { //Add newly message to file_DWXX printf("Return value is %d \n",ret); printf("**********Add newly message to file_DWXX************\n"); fp = Fopen( "DWXX.data","a+"); Fwrite( &newMesg.dwxx,LEN_DWXX,1,fp ); Fclose( fp ); AddCount( TYPE_OF_DWXX , 1); Pthread_mutex_unlock( &fLock.DW_FLOCK); } else if( ret == EBUSY ) { printf("First time bulid DWXX temp file!\n"); TempStore( TYPE_OF_DWXX, CREAT ); } } break; case TYPE_OF_TXXX: //If there is no temp file in current directory,we record it to INDEX file directly if( TempStore( TYPE_OF_TXXX, QUERY ) == 0 ) { //try to lock the mutex printf("Enter tryLock.\n"); if( (ret=Pthread_mutex_trylock( &fLock.TXINDEX_FLOCK)) == 0 ) { //Add newly message to file_DWXX printf("Return value is %d \n",ret); printf("**********Add newly message to file_TXINDEX************\n"); printf(" MainIndex is %d \n ",newMesg.txIndex.mainIndex); fp = Fopen( "TXINDEX.data","a+"); Fwrite( &newMesg.txIndex,LEN_TXINDEX,1,fp ); Fclose( fp ); AddCount( TYPE_OF_TXXX , 1); Pthread_mutex_unlock( &fLock.TXINDEX_FLOCK); } else if( ret == EBUSY ) { printf("First time bulid TXXX temp file!\n"); TempStore( TYPE_OF_TXXX, CREAT ); } } break; case TYPE_OF_ICXX: break; case TYPE_OF_ZJXX: break; case TYPE_OF_SJXX: break; case TYPE_OF_BBXX: break; case TYPE_OF_FKXX: break; }//End of switch}void MergeRecords( MESGTYPE mesgType ){ int i; FILE *fp; struct stat buf; /* Before we load the data from main data file */ /* we shall firstly merge the temp file to it */ switch( mesgType ) { case TYPE_OF_DWXX: if( stat( "DWtmp1.data",&buf ) == 0 )//file DWtmp1 exist { Pthread_mutex_lock( &fLock.DWtmp1_FLOCK ); printf("Lock temp1 now.\n"); //Add all the newly messages in the temp file1 to main data file loadedMesg.tmpLocInfo = (LOCINFO *)malloc( LEN_LOCINFO * tmpDWXX1); printf("Address is %lX\n",loadedMesg.tmpLocInfo); fp = Fopen( "DWtmp1.data","r+"); //perror("Open"); for( i=0; i<tmpDWXX1; i++)
if( fread( &( (loadedMesg.tmpLocInfo)[i].dwxx), LEN_DWXX, 1, fp) != 1)
{
if( feof(fp))
{
Fclose(fp);
break;
}
perror("File read error!");
} else { (loadedMesg.tmpLocInfo)[i].index = i+1; printf("Index is %d.\n",(loadedMesg.tmpLocInfo)[i].index); printf("Tmp File content:Hour %d Min %d SRCID %lX\n",loadedMesg.tmpLocInfo[i].dwxx.hour,loadedMesg.tmpLocInfo[i].dwxx.minute,loadedMesg.tmpLocInfo[i].dwxx.srcID ); } Fclose( fp ); fp = Fopen( "DWXX.data","a+"); for( i= 0; i< tmpDWXX1; i++ ) Fwrite( &( (loadedMesg.tmpLocInfo)[i].dwxx),LEN_DWXX,1,fp ); Fclose( fp ); remove( "DWtmp1.data"); tmpDWXX1 = 0; free( loadedMesg.tmpLocInfo ); Pthread_mutex_unlock( &fLock.DWtmp1_FLOCK ); } else if( stat( "DWtmp2.data",&buf ) == 0 )//file DWtmp2 exist { Pthread_mutex_lock( &fLock.DWtmp2_FLOCK ); //Add all the newly messages in the temp file2 to main data file loadedMesg.tmpLocInfo = (LOCINFO *)malloc( LEN_LOCINFO * tmpDWXX1); fp = Fopen( "DWtmp2.data","r+"); for( i=0; i<tmpDWXX2; i++)
if( fread( &( (loadedMesg.tmpLocInfo)[i].dwxx), LEN_DWXX, 1, fp) != 1)
{
if( feof(fp))
{
Fclose(fp);
break;
}
perror("File read error!");
} else { (loadedMesg.tmpLocInfo)[i].index = i+1; printf("Index is %d.\n",(loadedMesg.tmpLocInfo)[i].index); printf("Tmp File content:Hour %d Min %d SRCID %lX\n",loadedMesg.tmpLocInfo[i].dwxx.hour,loadedMesg.tmpLocInfo[i].dwxx.minute,loadedMesg.tmpLocInfo[i].dwxx.srcID ); } Fclose( fp ); fp = Fopen( "DWXX.data","a+"); for( i= 0; i< tmpDWXX2; i++ ) Fwrite( &( (loadedMesg.tmpLocInfo)[i].dwxx),LEN_DWXX,1,fp ); Fclose( fp ); remove( "DWtmp2.data"); free( loadedMesg.tmpLocInfo ); tmpDWXX2 = 0; Pthread_mutex_unlock( &fLock.DWtmp2_FLOCK ); } break; case TYPE_OF_TXXX: if( stat( "TXtmp1.data",&buf ) == 0 )//file TXtmp1 exist { Pthread_mutex_lock( &fLock.TXtmp1_FLOCK ); printf("Lock TXtmp1 now.\n"); //Add all the newly messages in the temp file1 to main data file loadedMesg.tmpCommInfo = (COMMINFO *)malloc( LEN_COMMINFO * tmpTXXX1); printf("Address is %lX\n",loadedMesg.tmpCommInfo); fp = Fopen( "TXtmp1.data","r+"); //perror("Open"); for( i=0; i<tmpTXXX1; i++)
if( fread( &((loadedMesg.tmpCommInfo)[i].txIndex), LEN_TXINDEX, 1, fp)!= 1)
{
if( feof(fp))
{
Fclose(fp);
break;
}
perror("File read error!");
} else { (loadedMesg.tmpCommInfo)[i].index = i+1; printf("Index is %d.\n",(loadedMesg.tmpCommInfo)[i].index); printf("Tmp File content:Hour %d Min %d SRCID %lX\n",loadedMesg.tmpCommInfo[i].txIndex.hour,loadedMesg.tmpCommInfo[i].txIndex.minute,loadedMesg.tmpCommInfo[i].txIndex.srcID ); } Fclose( fp ); fp = Fopen( "TXINDEX.data","a+"); for( i= 0; i< tmpTXXX1; i++ ) Fwrite( &( (loadedMesg.tmpCommInfo)[i].txIndex),LEN_TXINDEX,1,fp ); Fclose( fp ); remove( "TXtmp1.data"); tmpTXXX1 = 0; free( loadedMesg.tmpCommInfo ); Pthread_mutex_unlock( &fLock.TXtmp1_FLOCK ); } else if( stat( "TXtmp2.data",&buf ) == 0 )//file TXtmp2 exist { Pthread_mutex_lock( &fLock.TXtmp2_FLOCK ); //Add all the newly messages in the temp file2 to main data file loadedMesg.tmpCommInfo = (COMMINFO *)malloc( LEN_COMMINFO * tmpTXXX1); fp = Fopen( "TXtmp2.data","r+"); for( i=0; i<tmpTXXX2; i++)
if( fread( &((loadedMesg.tmpCommInfo)[i].txIndex), LEN_TXINDEX, 1, fp) != 1)
{
if( feof(fp))
{
Fclose(fp);
break;
}
perror("File read error!");
} else { (loadedMesg.tmpCommInfo)[i].index = i+1; printf("Index is %d.\n",(loadedMesg.tmpCommInfo)[i].index); printf("Tmp File content:Hour %d Min %d SRCID %lX\n",loadedMesg.tmpCommInfo[i].txIndex.hour,loadedMesg.tmpCommInfo[i].txIndex.minute,loadedMesg.tmpCommInfo[i].txIndex.srcID ); } Fclose( fp ); fp = Fopen( "TXINDEX.data","a+"); for( i= 0; i< tmpTXXX2; i++ ) Fwrite( &( (loadedMesg.tmpCommInfo)[i].txIndex),LEN_TXINDEX,1,fp ); Fclose( fp ); remove( "TXtmp2.data"); free( loadedMesg.tmpCommInfo ); tmpTXXX2 = 0; Pthread_mutex_unlock( &fLock.TXtmp2_FLOCK ); } break; case TYPE_OF_ICXX: break; case TYPE_OF_ZJXX: break; case TYPE_OF_SJXX: break; case TYPE_OF_BBXX: break; case TYPE_OF_FKXX: break; }//End of switch }void SaveData( SOURCETYPE sType, MESGTYPE mesgType, int count ){ FILE *fp; LOCINFO **p; COMMINFO **q; switch( mesgType ) { case TYPE_OF_DWXX: fp = Fopen( "DWXX.data","w+"); rewind( fp ); for( p = loadedMesg.pLocInfo; p<(loadedMesg.pLocInfo+count); p++ ) if( p != NULL ) Fwrite( &((*p)->dwxx),LEN_DWXX,1,fp ); Fclose( fp ); break; case TYPE_OF_TXXX: if( sType == INBOX ) { fp = Fopen( "TXINDEX.data","w+"); rewind( fp ); for( q = loadedMesg.pCommInfo; q<(loadedMesg.pCommInfo+count); q++ ) if( q != NULL ) Fwrite( &((*q)->txIndex),LEN_TXINDEX ,1,fp ); Fclose( fp ); } else if( sType == OUTBOX ) { fp = Fopen( "TXINDEX_OUT.data","w+"); rewind( fp ); for( q = loadedMesg.pCommInfoOut; q<(loadedMesg.pCommInfoOut+count); q++ ) if( q != NULL ) Fwrite( &((*q)->txIndex),LEN_TXINDEX ,1,fp ); Fclose( fp ); } break; case TYPE_OF_ICXX: break; case TYPE_OF_ZJXX: break; case TYPE_OF_SJXX: break; case TYPE_OF_BBXX: break; case TYPE_OF_FKXX: break; }}//the following code shall be embedded in liwencheng's procedure void saveSendedItem( ){ //we shall firstly fill the struct sendedItem to //be set then write it to the local file /*if( datalength <= 20 bytes ) { //only stored the whole message in file F_TXINDEX memcpy( newMesg.txIndex.message, ptr->txxx.message,20); newMesg.txIndex.mainIndex = -1; } else { // divide the message to two parts,one of it is the // content the other part is the indexer of the message newMesg.txIndex.mainIndex = ++countTXMNOut; // Add the big data block to file F_TXMAIN if( countTXMNOut <= AUTOROLLVAL_TXOUT) { fp = Fopen( "TXMAIN_OUT.data","a+"); Fwrite( &(ptr->txxx.message),MAXSIZE,1,fp ); Fclose( fp ); } else { if( (i = DEQUEUE( OUTBOX )) != 0) { fp = Fopen( "TXMAIN_OUT.data","w+"); fseek( fp, (i-1)*LEN_TXINDEX, SEEK_SET ); Fwrite( &(ptr->txxx.message),MAXSIZE,1,fp ); Fclose( fp ); } else if( i == 0) { printf("****Fail to get data for the empty queue****\n"); } } } //whatever,save the indexer of the data fp = Fopen( "TXINDEX_OUT.data","a+"); Fwrite( &newMesg.txIndex,LEN_TXINDEX,1,fp ); Fclose( fp ); countTXIDXOut++; */}/* Return the length of the message structure array and its address array */void *LoadData( void *arg ){ int i; FILE *fp; LOCINFO **p; COMMINFO **q; struct stat buf; printf("Enter LoadData now.\n"); if( loadArg.mesgCount == 0) printf("NULL records in the file!\n"); loadedMesg.countOfUnread =0; switch( loadArg.mesgType ) { case TYPE_OF_DWXX: Pthread_mutex_lock( &fLock.DW_FLOCK ); Pthread_mutex_lock( &countTXINDEX_Mutex ); MergeRecords( TYPE_OF_DWXX ); /* Alloacate the memory of message array.*/ if( loadArg.mesgCount <= AUTOROLLVAL_DW ) { loadedMesg.locInfo = (LOCINFO *)malloc( LEN_LOCINFO * loadArg.mesgCount); fp = Fopen( "DWXX.data","r+"); rewind(fp); for( i=0; i<loadArg.mesgCount; i++) /******Problem here,can't use the wrapper function Fread()*******/
if( fread( &( (loadedMesg.locInfo)[i].dwxx), LEN_DWXX, 1, fp) != 1)
{
if( feof(fp))
{
Fclose(fp);
break;
}
perror("File read error!");
} else { (loadedMesg.locInfo)[i].index = i+1; printf("Index is %d.\n",(loadedMesg.locInfo)[i].index); printf("File content:Hour %d Min %d SRCID %lX\n",loadedMesg.locInfo[i].dwxx.hour,loadedMesg.locInfo[i].dwxx.minute,loadedMesg.locInfo[i].dwxx.srcID ); printf(" Address of the message %d is %lX.\n",i,&loadedMesg.locInfo[i] ); } Fclose( fp ); /* Alloacate the memory of address array for message */
p= loadedMesg.pLocInfo = malloc( LEN_P_LOCINFO * loadArg.mesgCount ); printf(" Address of the address array head is %lX.\n",loadedMesg.pLocInfo ); for( i=0; i<loadArg.mesgCount; i++) { *p = &loadedMesg.locInfo[i]; printf(" Address of the message pointer %d is %lX.\n",i,*p ); p++; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -