Created
April 18, 2015 16:15
-
-
Save zikosw/073bcce886fef09bf1a1 to your computer and use it in GitHub Desktop.
os'rfos
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| void mirrorWrite(int diskGroup,void* data,guint64 addr,guint size){ | |
| if(diskGroup==0){ // first | |
| if(newDisk[0]==FALSE){ | |
| editFile(diskFileName[0],data,addr,size); | |
| }else{ | |
| printf("D0 is new\n"); | |
| } | |
| if(newDisk[1]==FALSE){ | |
| editFile(diskFileName[1],data,addr,size); | |
| }else{ | |
| printf("D1 is new\n"); | |
| } | |
| } | |
| if(diskGroup==1){ // second | |
| if(newDisk[2]==FALSE){ | |
| editFile(diskFileName[2],data,addr,size); | |
| }else{ | |
| printf("D2 is new\n"); | |
| } | |
| if(newDisk[3]==FALSE){ | |
| editFile(diskFileName[3],data,addr,size); | |
| }else{ | |
| printf("D3 is new\n"); | |
| } | |
| } | |
| } | |
| void diskWriteData(void* data,guint64 addr,guint size){ | |
| // 4 disk mng | |
| // first | |
| if(addr+size<DISK_SIZE){ | |
| mirrorWrite(0,data,addr,size); | |
| } | |
| // cross 2 disk | |
| else if(addr<DISK_SIZE){ | |
| guint size0,size1; | |
| guint64 addr0,addr1; | |
| void *data0,*data1; | |
| // 0 | |
| size0=DISK_SIZE-addr; | |
| addr0=addr; | |
| data0=data; | |
| mirrorWrite(0,data0,addr0,size0); | |
| // 1 | |
| size1=size-size0; | |
| addr1=HEADER_SIZE; | |
| data1=data+size0; | |
| mirrorWrite(1,data1,addr1,size1); | |
| } | |
| // second | |
| else{ | |
| addr=addr-DISK_SIZE+HEADER_SIZE; | |
| mirrorWrite(1,data,addr,size); | |
| } | |
| } | |
| guint8* diskRead(int diskNo,guint64 addr,guint size){ | |
| FILE* fileptr; | |
| guint8* buffer; | |
| fileptr = fopen(diskFileName[diskNo],"rb"); // Open file in binary | |
| fseek(fileptr,addr,SEEK_SET); // Seek file to the end | |
| buffer = (guint8*) malloc((size)*sizeof(guint8)); // Allocation memory for read file | |
| // TODO : Avoid allocate ahead (allocate only need) | |
| fread(buffer,size,1,fileptr); // Read file | |
| fclose(fileptr); // close file | |
| return buffer; | |
| } | |
| guint8* mirrorRead(int diskGroup,guint64 addr,guint size){ | |
| // Implement strip read | |
| if(diskGroup==0){ // in first {0,1} | |
| if(newDisk[0]==FALSE){ // if disk 0 is not new (sync) | |
| return diskRead(0,addr,size); | |
| }else{ | |
| return diskRead(1,addr,size); | |
| } | |
| } | |
| if(diskGroup==1){ // in second {2,3} | |
| if(newDisk[2]==FALSE){ // if disk 2 is not new (sync) | |
| return diskRead(2,addr,size); | |
| }else{ | |
| return diskRead(3,addr,size); | |
| } | |
| } | |
| return NULL; | |
| } | |
| guint8* diskReadData(guint64 addr,guint size){ | |
| // Check addr (cross 2 disk?) | |
| if(addr+size<DISK_SIZE){// in first | |
| printf("Read @%"G_GUINT64_FORMAT" (%u)\n",addr,size); | |
| // TODO : check new disk and dont read from theme | |
| return mirrorRead(0,addr,size); | |
| } | |
| else if(addr<DISK_SIZE){ // cross 2 disk | |
| guint64 addr0,addr1; | |
| guint size0,size1; | |
| guint8 *data0,*data1; | |
| //0 | |
| size0=DISK_SIZE-addr; | |
| addr0=addr; | |
| printf("Read 0@%"G_GUINT64_FORMAT" (%u)\n",addr0,size0); | |
| data0=mirrorRead(0,addr0,size0); | |
| //1 | |
| size1=size-size0; | |
| addr1=HEADER_SIZE; // 0-15 size,16 mode | |
| printf("Read 1@%"G_GUINT64_FORMAT" (%u)\n",addr1,size1); | |
| data1=mirrorRead(1,addr1,size1); | |
| // merge 2 data | |
| guint8* data=(guint8*) malloc(size*sizeof(guint8)); | |
| memmove(data,data0,size0); | |
| memmove(data+size0,data1,size1); | |
| return data; | |
| }else if(diskMode==10){ // in second and diskMode=10 | |
| addr=addr-DISK_SIZE+HEADER_SIZE; | |
| printf("Read @%"G_GUINT64_FORMAT" (%u)\n",addr,size); | |
| return mirrorRead(1,addr,size); | |
| } | |
| return NULL; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment