/* Allocate in MidMem a new empty Block for file * opening with fileDesc using services provided * from lower Levels. Set blockbuf to point to * the beginning of this block and inform blockNum. * Check all errors that may occur and return * respective error code, else return BFE_OK. */ int BF_AllocBlock(int fileDesc ,int *blockNum ,char **blockBuf ) { int RetVal; fileInfo_t finfo; if ( (RetVal=FMM_HEAD_GetFirstEmpty(fileDesc)) < 0 ) /* check header to find pos of first empty block */ return RetVal; *blockNum=RetVal; /* inform blockNum */ finfo.fd=fileDesc; if ( (RetVal=FMM_GetFileInfoByFD(&finfo)) != BFE_OK ) /* FMM_GetFileInfoByFD checkinging valid of fd */ return RetVal; if ( (RetVal=BMM_AllocBlock(finfo,*blockNum,blockBuf)) != BFE_OK ) /* Allock block */ return RetVal; if ( (RetVal=FMM_HEAD_Set(fileDesc,*blockNum,TRUE)) != BFE_OK ) /* inform header */ return RetVal; return BFE_OK; }
int main(void) { int rvalue; FILE *fp1, *fp2; char *buffer, *bufStart; int fd11, fd12, fd13; int fd21, fd22, fd23; int i,j, randNum, randFd; fileInfo_t finfo; // ---------------------- Dimiourgia twn fileName1 kai fileName2 ---------------------- // ---------------------- Dimiourgia tou fileName1 ---------------------- printf("\n--------------\n"); printf("CREATING FILES\n"); printf("--------------\n\n"); // Elegxos an yparxei to fileName1 printf("Checking if file %s exists...\n\n", fileName1); if (HDF_ExistsFile(fileName1) == TRUE) { printf("Checkpoint 1:\n"); printf("HDF_ExistsFile returned TRUE!\n\n"); } // Dimiourgia tou arxeiou fileName1 printf("Creating file %s...\n\n", fileName1); if ( (rvalue = HDF_CreateFile(fileName1)) != BFE_OK) { printf("Checkpoint 2:\n"); printf("HDF_CreateFile() returned %d!\n\n", rvalue); } // Anoigma tou arxeiou fileName1 printf("Opening file %s...\n\n", fileName1); if ((rvalue = HDF_OpenFile(fileName1, &fp1)) != BFE_OK) { printf("Checkpoint 3:\n"); printf("HDF_OpenFile() returned %d, should have returned 0!\n\n",rvalue); } // Dimiourgia epikefalidas tou arxeiou sti mnimi buffer = malloc(sizeof(char) * BF_BLOCK_SIZE); bufStart = buffer; memset(buffer, 0, BF_BLOCK_SIZE); // Antigrafi epikefalidas sto block 0 tou arxeiou printf("Writing file header to disk...\n\n"); if ((rvalue = HDF_WriteBlock(0, buffer, fp1)) != BFE_OK) { printf("Checkpoint 4:"); printf("HDF_WriteBlock() returned %d!\n\n",rvalue); } // Kleisimo tou arxeiou fileName1 printf("Closing file %s\n\n", fileName1); if ((rvalue = HDF_CloseFile(fp1)) != BFE_OK) { printf("Checkpoint 5:\n"); printf("HDF_CloseFile() returned %d!\n\n", rvalue); } // ---------------------- Dimiourgia tou fileName2 ---------------------- // Elegxos an yparxei to fileName2 printf("Checking if file %s exists...\n\n", fileName2); if (HDF_ExistsFile(fileName2) == TRUE) { printf("Checkpoint 6:\n"); printf("HDF_ExistsFile returned TRUE!\n\n"); } // Dimiourgia tou arxeiou fileName2 printf("Creating file %s...\n\n", fileName2); if ( (rvalue=HDF_CreateFile(fileName2)) != BFE_OK) { printf("Checkpoint 7:\n"); printf("HDF_CreateFile() returned %d!\n\n", rvalue); } // Anoigma tou arxeiou fileName2 printf("Opening file %s...\n\n", fileName2); if ((rvalue = HDF_OpenFile(fileName2, &fp2)) != BFE_OK) { printf("Checkpoint 8:\n"); printf("HDF_OpenFile() returned %d, should have returned 0!\n\n",rvalue); } // Antigrafi epikefalidas sto block 0 tou arxeiou printf("Writing file header to disk...\n\n"); if ((rvalue = HDF_WriteBlock(0, buffer, fp2)) != BFE_OK) { printf("Checkpoint 9:"); printf("HDF_WriteBlock() returned %d!\n\n",rvalue); } // Kleisimo tou arxeiou fileName2 printf("Closing file %s\n\n", fileName2); if ((rvalue = HDF_CloseFile(fp2)) != BFE_OK) { printf("Checkpoint 10:\n"); printf("HDF_CloseFile() returned %d!\n\n", rvalue); } // ---------------------- FMM epipedo ---------------------- printf("------------------------------------\n"); printf("OPENING AND PROCESSING FILES\n"); printf("------------------------------------\n\n"); FMM_Init(); BMM_Init(); // 1o anoigma tou fileName1 printf("Opening file %s (1)...\n\n", fileName1); if ((fd11 = FMM_Open(fileName1)) < 0) { printf("Checkpoint 11:\n"); printf("FMM_Open() returned %d!\n\n", fd11); } // 2o anoigma tou fileName1 printf("Opening file %s (2)...\n\n", fileName1); if ((fd12 = FMM_Open(fileName1)) < 0) { printf("Checkpoint 12:\n"); printf("FMM_Open() returned %d!\n\n", fd12); } // 3o anoigma tou fileName1 printf("Opening file %s (3)...\n\n", fileName1); if ((fd13 = FMM_Open(fileName1)) < 0) { printf("Checkpoint 13:\n"); printf("FMM_Open() returned %d!\n\n", fd12); } // 1o anoigma tou fileName2 printf("Opening file %s (1)...\n\n", fileName2); if ((fd21 = FMM_Open(fileName2)) < 0) { printf("Checkpoint 14:\n"); printf("FMM_Open() returned %d!\n\n", fd21); } // 2o anoigma tou fileName2 printf("Opening file %s (2)...\n\n", fileName2); if ((fd22 = FMM_Open(fileName2)) < 0) { printf("Checkpoint 15:\n"); printf("FMM_Open() returned %d!\n\n", fd21); } // 3o anoigma tou fileName2 printf("Opening file %s (3)...\n\n", fileName2); if ((fd23 = FMM_Open(fileName2)) < 0) { printf("Checkpoint 16:\n"); printf("FMM_Open() returned %d!\n\n", fd21); } // Ftiakse BLOCKS blocks gia kathe ena apo ta files for (i=0;i<BLOCKS;i++){ randNum = rand()%3; if (randNum==1) randFd = fd13; else if (randNum==2) randFd = fd11; else randFd = fd12; finfo.fd = randFd; if ((rvalue = FMM_GetFileInfoByFD(&finfo)) < 0) { printf("Checkpoint 17:\n"); printf("FMM_GetFileInfoByFD() returned %d!\n\n", rvalue); } if ((rvalue = BMM_AllocBlock(finfo,i,&buffer)) < 0) { printf("Checkpoint 18:\n"); printf("BMM_AllocBlock() returned %d!\n\n", rvalue); } if ((rvalue = FMM_HEAD_Set(fd11, i, TRUE)) < 0) { printf("Checkpoint 19:\n"); printf("FMM_HEAD_Set() returned %d!\n\n", rvalue); } // Tropopoiisi tou block pou "efere" i BMM_AllocBlock j=(300-i)*(300-i); memcpy(buffer,&j,sizeof(int)); if ((rvalue = BMM_UnpinBlock(finfo,i,TRUE)) < 0) { printf("Checkpoint 20:\n"); printf("BMM_UnpinBlock() returned %d!\n\n", rvalue); } randNum = rand()%3; if (randNum==1) randFd = fd22; else if (randNum==2) randFd = fd21; else randFd = fd23; finfo.fd = randFd; if ((rvalue = FMM_GetFileInfoByFD(&finfo)) < 0) { printf("Checkpoint 21:\n"); printf("FMM_GetFileInfoByFD() returned %d!\n\n", rvalue); } if ((rvalue = BMM_AllocBlock(finfo,i,&buffer)) < 0) { printf("Checkpoint 22:\n"); printf("BMM_AllocBlock() returned %d!\n\n", rvalue); } if ((rvalue = FMM_HEAD_Set(fd21, i, TRUE)) < 0) { printf("Checkpoint 23:\n"); printf("FMM_HEAD_Set() returned %d!\n\n", rvalue); } // Tropopoiisi tou block pou "efere" i BMM_AllocBlock memcpy(buffer,&i,sizeof(int)); if ((rvalue = BMM_UnpinBlock(finfo,i,TRUE)) < 0) { printf("Checkpoint 24:\n"); printf("BMM_UnpinBlock() returned %d!\n\n", rvalue); } } finfo.fd = fd11; if ((rvalue = FMM_GetFileInfoByFD(&finfo)) < 0) { printf("Checkpoint 25:\n"); printf("FMM_GetFileInfoByFD() returned %d!\n\n", rvalue); } if ((rvalue = BMM_Flush(finfo)) < 0) { printf("Checkpoint 26:\n"); printf("BMM_Flush() returned %d!\n\n", rvalue); } finfo.fd = fd21; if ((rvalue = FMM_GetFileInfoByFD(&finfo)) < 0) { printf("Checkpoint 27:\n"); printf("FMM_GetFileInfoByFD() returned %d!\n\n", rvalue); } if ((rvalue = BMM_Flush(finfo)) < 0) { printf("Checkpoint 28:\n"); printf("BMM_Flush() returned %d!\n\n", rvalue); } printf("-------------\n"); printf("CLOSING FILES\n"); printf("-------------\n\n"); // Kleisimo 1ou anoigmatos tou fileName1 printf("Closing file %s (1)...\n\n", fileName1); if ((rvalue = FMM_Close(fd11)) != BFE_OK) { printf("Checkpoint 29:\n"); printf("FMM_Close() returned %d!\n\n", rvalue); } // Kleisimo 2ou anoigmatos tou fileName1 printf("Closing file %s (2)...\n\n", fileName1); if ((rvalue = FMM_Close(fd12)) != BFE_OK) { printf("Checkpoint 31:\n"); printf("FMM_Close() returned %d!\n\n", rvalue); } // Kleisimo 3ou anoigmatos tou fileName1 printf("Closing file %s (3)...\n\n", fileName1); if ((rvalue = FMM_Close(fd13)) != BFE_OK) { printf("Checkpoint 31:\n"); printf("FMM_Close() returned %d!\n\n", rvalue); } // Kleisimo 1ou anoigmatos tou fileName2 printf("Closing file %s (1)...\n\n", fileName2); if ((rvalue = FMM_Close(fd21)) != BFE_OK) { printf("Checkpoint 32:\n"); printf("FMM_Close() returned %d!\n\n", rvalue); } // Kleisimo 2ou anoigmatos tou fileName2 printf("Closing file %s (2)...\n\n", fileName2); if ((rvalue = FMM_Close(fd22)) != BFE_OK) { printf("Checkpoint 33:\n"); printf("FMM_Close() returned %d!\n\n", rvalue); } // Kleisimo 3ou anoigmatos tou fileName2 printf("Closing file %s (3)...\n\n", fileName2); if ((rvalue = FMM_Close(fd23)) != BFE_OK) { printf("Checkpoint 34:\n"); printf("FMM_Close() returned %d!\n\n", rvalue); } free(bufStart); return 0; }