/* * pcb.c * * Created on: 8/5/2016 * Author: utnso */ #include "pcb.h" int32_t tamano_etiqueta(t_indice_etiq etiqueta){ return sizeof(etiqueta.pos_real)+ sizeof(etiqueta.tamano_etiqueta)+ sizeof(char) * etiqueta.tamano_etiqueta; } int32_t tamanio_indice_etiquetas(t_pcb pcb){ int i; int32_t contador = 0; for(i=0; i < (pcb.cant_etiquetas); i++) contador += tamano_etiqueta(pcb.indice_etiquetas[i]); return contador; } int32_t tamanio_indice_stack(t_pcb pcb){ int i; int32_t contador = 0; for(i=0; i < (pcb.cant_entradas_indice_stack); i++) contador += sizeof(pcb.indice_stack->posicion) + sizeof(pcb.indice_stack->cant_argumentos) + sizeof(t_posMemoria) * pcb.indice_stack[i].cant_argumentos+ sizeof(pcb.indice_stack->cant_variables) + sizeof(t_variable) * pcb.indice_stack[i].cant_variables+ sizeof(pcb.indice_stack->pos_retorno)+ sizeof(pcb.indice_stack->pos_var_retorno); return contador; } int32_t tamanio_pcb(t_pcb pcb){ return sizeof(pcb.pid)+ sizeof(pcb.pc)+ sizeof(pcb.cant_pags_totales)+ sizeof(pcb.fin_stack)+ sizeof(pcb.cant_instrucciones)+ sizeof(t_posMemoria) * pcb.cant_instrucciones + sizeof(pcb.cant_etiquetas)+ tamanio_indice_etiquetas(pcb)+ sizeof(pcb.cant_entradas_indice_stack)+ tamanio_indice_stack(pcb); } int agregar(char *to,int32_t tamano, void* from){ memcpy(to,from,tamano); return tamano; } t_pcb_serializado serializar(t_pcb pcb) { t_pcb_serializado pcb_serializado; pcb_serializado.tamanio = tamanio_pcb(pcb); pcb_serializado.contenido_pcb = malloc(pcb_serializado.tamanio); int i; int offset=0; int32_t proximo_tamano_a_serializar; offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.pid),&pcb.pid); offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.pc),&pcb.pc); offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.cant_pags_totales),&pcb.cant_pags_totales); offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.fin_stack),&pcb.fin_stack); offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.cant_instrucciones),&pcb.cant_instrucciones); for(i=0;itamano_etiqueta),&pcb.indice_etiquetas[i].tamano_etiqueta); offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.indice_etiquetas->pos_real),&pcb.indice_etiquetas[i].pos_real); offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.indice_etiquetas[i].tamano_etiqueta),pcb.indice_etiquetas[i].etiq); } offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.cant_entradas_indice_stack),&pcb.cant_entradas_indice_stack); for(i=0;iposicion),&pcb.indice_stack[i].posicion); offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.indice_stack->cant_argumentos),&pcb.indice_stack[i].cant_argumentos); for(j=0;jcant_argumentos;j++){ offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(t_posMemoria),&pcb.indice_stack[i].argumentos[j]); } offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.indice_stack->cant_variables),&pcb.indice_stack[i].cant_variables); for(j=0;jcant_variables;j++){ offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(t_variable),&pcb.indice_stack[i].variables[j]); } offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.indice_stack->pos_retorno),&pcb.indice_stack[i].pos_retorno); offset+=agregar(pcb_serializado.contenido_pcb+offset,sizeof(pcb.indice_stack->pos_var_retorno),&pcb.indice_stack[i].pos_var_retorno); } return pcb_serializado; } destruir_pcb_serializado(t_pcb_serializado pcbs){ free(pcbs.contenido_pcb); } void deserializar(t_pcb pcb) { } int main(int argc, char **argv){ t_pcb pcb_prueba; t_posMemoria indice_codigo_prueba; t_posMemoria indice_codigo_prueba2; t_indice_etiq indice_etiqueta_prueba; registro_indice_stack indice_stack_prueba; indice_codigo_prueba.pag=11; indice_codigo_prueba.offset=12; indice_codigo_prueba.size=13; indice_codigo_prueba2.pag=21; indice_codigo_prueba2.offset=22; indice_codigo_prueba2.size=33; indice_etiqueta_prueba.tamano_etiqueta=7; indice_etiqueta_prueba.etiq="sarasa"; indice_etiqueta_prueba.pos_real.pag=2; indice_etiqueta_prueba.pos_real.offset=10; indice_etiqueta_prueba.pos_real.size=19; indice_stack_prueba.posicion=7; indice_stack_prueba.cant_argumentos=1; indice_stack_prueba.argumentos[0]=indice_codigo_prueba2; indice_stack_prueba.cant_variables=1; indice_stack_prueba.variables->id=1; indice_stack_prueba.variables->posicionVar[0]=indice_codigo_prueba; indice_stack_prueba.pos_retorno=28; indice_stack_prueba.pos_var_retorno=indice_codigo_prueba2; pcb_prueba.pid=1; pcb_prueba.pc=0; pcb_prueba.cant_pags_totales=15; pcb_prueba.fin_stack=0; pcb_prueba.cant_instrucciones; pcb_prueba.indice_codigo[0]=indice_codigo_prueba; pcb_prueba.indice_codigo[1]=indice_codigo_prueba2; pcb_prueba.cant_etiquetas=1; pcb_prueba.indice_etiquetas[0]=indice_etiqueta_prueba; pcb_prueba.cant_entradas_indice_stack=1; pcb_prueba.indice_stack[0]=indice_stack_prueba; }