From: Nicolás Dimov Date: Mon, 19 Apr 2004 06:04:09 +0000 (+0000) Subject: sigue fallando con bloques chicos pero con bloques grandes anda ok X-Git-Tag: svn_import_r684~303 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/a4236f038178839da58930dbecd0f3b45637e448?ds=sidebyside sigue fallando con bloques chicos pero con bloques grandes anda ok --- diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 02c6495..1e35948 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -54,6 +54,8 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, int cant_bloques = 0, resto, i, copiado=0; cant_bloques = (emu->tam_reg / (emu->tam_bloque-sizeof(EMUFS_REG_ID))) + 1; + if ( emu->tam_reg+sizeof(EMUFS_REG_ID) == emu->tam_bloque ) + cant_bloques = 1; /*si existe, lo busco en el archivo de bloques*/ block = emufs_idx_buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/ @@ -160,9 +162,11 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t strcat(name_f,".dat"); cant_bloques = (emu->tam_reg / (emu->tam_bloque-sizeof(EMUFS_REG_ID))) + 1; + if ( emu->tam_reg+sizeof(EMUFS_REG_ID) == emu->tam_bloque ) + cant_bloques = 1; resto = emu->tam_bloque - sizeof(EMUFS_REG_ID); lugar = emu->tam_reg + sizeof(EMUFS_REG_ID); - if ( emu->tam_bloque < emu->tam_reg - sizeof(EMUFS_REG_ID) ) + if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg ) lugar = emu->tam_bloque; /* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/ num_bloque = emufs_fsc_buscar_lugar(emu, lugar, &fs); @@ -206,9 +210,9 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t } /* grabo el nuevo registro en el archivo de espacios libres */ - if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) >= emu->tam_reg ) - new_fs = emu->tam_bloque - emu->tam_reg - sizeof(EMUFS_REG_ID); - else new_fs = emu->tam_bloque - resto - sizeof(EMUFS_REG_ID); + if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg ) + new_fs = emu->tam_bloque - sizeof(EMUFS_REG_ID) - resto ; + else new_fs = emu->tam_bloque - sizeof(EMUFS_REG_ID) - emu->tam_reg ; if ( emufs_fsc_agregar(emu, num_bloque+i, new_fs) ) { fclose(file); free(bloque); @@ -252,18 +256,21 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t } /*actualizo el archivo de espacios libres*/ - if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) > emu->tam_reg ){ - resto = emu->tam_reg; - if ( emufs_fsc_agregar(emu, num_bloque, fs - resto - sizeof(EMUFS_REG_ID) ) != 0 ) { + if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg ){ + /*Si el registro ocupa mas de un bloque (original) resto = emu->tam_bloque-sizeof(EMUFS_REG_ID)*/ + resto += sizeof(EMUFS_REG_ID); + if ( cant_bloques-1 == i ) + resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID))+sizeof(EMUFS_REG_ID); + printf("fs-resto = %d\n", emu->tam_bloque-resto); + if ( emufs_fsc_agregar(emu, num_bloque+i, fs-resto) !=0 ){ fclose(file); if (bloque) free(bloque); return -1; } } else { - resto += sizeof(EMUFS_REG_ID); - if ( cant_bloques-1 == i ) - resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID))+sizeof(EMUFS_REG_ID); - if ( emufs_fsc_agregar(emu, num_bloque+i, fs-resto) !=0 ){ + /* si ocupa menos de un bloque*/ + resto = emu->tam_reg; + if ( emufs_fsc_agregar(emu, num_bloque, fs - resto - sizeof(EMUFS_REG_ID) ) != 0 ) { fclose(file); if (bloque) free(bloque); return -1; @@ -313,6 +320,8 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) /*cantidad de bloques que ocupa un registro*/ cant_bloques = emu->tam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1; + if ( emu->tam_reg+sizeof(EMUFS_REG_ID) == emu->tam_bloque ) + cant_bloques = 1; num_bloque = emufs_idx_buscar_registro(emu, ID); if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) { @@ -342,7 +351,7 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) } /*grabo el bloque en el archivo*/ - if ( emu->tam_bloque < emu->tam_reg ) + if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg ) memset(bloque, 0, emu->tam_bloque); if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque) == -1 ){ free(bloque); @@ -508,7 +517,7 @@ void emufs_tipo3_compactar(EMUFS *emu) if (truncate(name, size)!=0) PERR("NO TRUNQUE NADA"); /*hay que truncar el fsc!!!*/ - if(emu->tam_bloquetam_reg-sizeof(EMUFS_REG_ID)) block_id = block_id/2; + if(emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg) block_id = block_id/2; if (emufs_fsc_truncate(emu, block_id)!= 0) PERR("NO TURNQUE EL FSC"); } diff --git a/emufs/tipo3_main.c b/emufs/tipo3_main.c index 6651fb1..509f497 100644 --- a/emufs/tipo3_main.c +++ b/emufs/tipo3_main.c @@ -51,7 +51,7 @@ int main(int argc, char *argv[]) char h[100]; char i[100]; char* b_ptr; - int err = 0, j, k; + int err = 0, j, k, cant_bloques; EMUFS_Estadisticas stats; if (argc != 2) { @@ -77,7 +77,10 @@ int main(int argc, char *argv[]) strcpy(i, "me argrego despues de borrar a un registro"); fp = emufs_crear("articulos", T3, atoi(argv[1]), 100); - printf("cant de bloques = %lu\n", fp->tam_reg/(fp->tam_bloque-sizeof(EMUFS_REG_ID)) +1); + cant_bloques = fp->tam_reg/(fp->tam_bloque-sizeof(EMUFS_REG_ID)) +1; + if ( fp->tam_reg+sizeof(EMUFS_REG_ID) == fp->tam_bloque ) + cant_bloques = 1; + printf("cant de bloques = %lu\n",cant_bloques ); printf("GRABANDO REGISTROS....\n"); for ( k=0; k<2; k++){ @@ -151,14 +154,16 @@ int main(int argc, char *argv[]) ver_archivo_FS(fp); printf("BORRANDO REGISTROS....\n"); - for (j=0; j<20; j++){ + for (j=0; j<20; j+=3){ fp->borrar_registro(fp, j); printf("borrado : %lu\n", j); } + /* printf("COMPACTANDO........\n"); fp->compactar(fp); + */ ver_archivo_FS(fp); - - emufs_destruir(fp); + debug_ver_estadisticas(fp); + emufs_destruir(fp); return 0; }