Skip to content

Instantly share code, notes, and snippets.

@zikosw
Created April 18, 2015 16:15
Show Gist options
  • Select an option

  • Save zikosw/073bcce886fef09bf1a1 to your computer and use it in GitHub Desktop.

Select an option

Save zikosw/073bcce886fef09bf1a1 to your computer and use it in GitHub Desktop.
os'rfos
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