Exemple #1
0
t_puntero primitiva_definirVariable(t_nombre_variable variable){
	t_puntero dirRetornada=-1;           //---->indica ERROR ???
if(!g_expulsar){
	t_size tamanio    =sizeof(t_nombre_variable);
	t_puntero base    =g_pcb.segmento_pila;
	t_size offset     =dictionary_size(g_diccionario_var)*(sizeof(t_byte)+sizeof(t_palabra))+(g_pcb.cursor_de_pila-g_pcb.segmento_pila);     //cada varibale ocupa 5 bytes(1byte:nombre+4bytes:contenido)
	printf("***primitiva--->definir Varible***\n");
	printf("            --->mandando a guardar var:%c base:%i offset:%i tamanio:%i<---\n",variable,base,offset,tamanio);
	log_debug(g_logger,":::primitiva_definirVariable:::\n    mandando a guardar la var:%c base:%i offset:%i tam:%i",variable,base,offset,tamanio);

	//ENVIA MENSAJE A UMV CON: base+offset+tamaño+contenido a almacenar
	if(escrituraUMV(base,offset,tamanio,(t_byte *)&variable)==-1){//=>segmentation fault?
		//error--->segmento sobrepasado
		printf("error de escritura de nombre de variable en umv -sEGMENTATIoN FAuLT-\n");
		log_debug(g_logger,"Error en la escritura del nombre de una variable en umv...");
		falloMemoria();
	}else{
		t_var *var_diccio =crearVarDiccio(variable,offset+1);
		//printf("se guardara la variable var_diccio->nombre_var:%s var_diccio->dir:%i\n",var_diccio->nombre_var,var_diccio->direccion_var);
		dictionary_put(g_diccionario_var,var_diccio->nombre_var,var_diccio);
		g_pcb.tamanio_contexto_actual++;
		dirRetornada=offset+1;
	}
}
	return dirRetornada;
}
void enviarPCB(pcb_t* pcb,int cpu, int quantum, int quantum_sleep){
	//NO TESTEADO
	serializablePCB aMandaCpu;
	aMandaCpu.PID = *(pcb->PID);
	aMandaCpu.PC= *(pcb->PC);
	aMandaCpu.PCI = *(pcb->PCI);
	aMandaCpu.SP = *(pcb->SP);
	aMandaCpu.paginasDisponible = *(pcb->paginasDisponible);
	aMandaCpu.tamanioIndiceCodigo = dictionary_size(pcb->indice_codigo);
	aMandaCpu.tamanioStack = dictionary_size(pcb->indice_stack);
	aMandaCpu.tamanioIndiceDeFunciones = list_size(pcb->indice_funciones);
	int enviaPCB = 163;
	enviarCPUConHeader(cpu,enviaPCB,sizeof(serializablePCB),&aMandaCpu,*(pcb->PID));
	/*
	 * Orden:
	 * 	Indice de codigo
	 * 	Indice de funciones
	 * 		[int (tamanio nombre funcion)] [int posicion] [char* funcion]
	 * 	stack
	 * 		//Tamanio Args
	 * 		//Tamanio Vars
	 * 		//PidRetorno, -1 si es el main
	 *		//direccion de memoria
	 *		//Lista Args
	 *		//Lista Vars
	 *
	 */
	//Empieza serializacion de listas y diccionarios
	//serializo indice de codigo y lo mando
	int tamanioIndiceCode =  aMandaCpu.tamanioIndiceCodigo;
	int i;
	for(i=0;i<tamanioIndiceCode && tamanioIndiceCode !=0;i++){
		direccionMemoria* aMandar = dictionary_get(pcb->indice_codigo,&i);
		enviarCPU(cpu,sizeof(direccionMemoria),aMandar,*(pcb->PID));
	}


	//serializo indice de funciones y lo mando
	int tamanioIndiceFunciones = aMandaCpu.tamanioIndiceDeFunciones;
	for(i=0;i<tamanioIndiceFunciones && tamanioIndiceFunciones != 0;i++){
		//SS sin serializar
		//CS con serializado
		funcion_sisop* funcionAMandarSS = list_get(pcb->indice_funciones,i);
		funcionTemp func;
		func.tamanioNombreFuncion = strlen(funcionAMandarSS->funcion)+1;//+1 para garegar el \0
		func.posicionPID = *(funcionAMandarSS->posicion_codigo);
		//Envio Tamanio y posicion
		enviarCPU(cpu,sizeof(funcionTemp),&func,*(pcb->PID));
		//Envio nombre funcion
		enviarCPU(cpu,func.tamanioNombreFuncion,strcat(funcionAMandarSS->funcion,"\0"),*(pcb->PID));
	}


	//serializo stack y lo mando
	//TESTEAR MUCHO YA Q ES UN KILOMBO
	int tamanioStack = aMandaCpu.tamanioStack;
	for(i=0;i<tamanioStack && tamanioStack!= 0;i++){
		stack* stackAMandar = dictionary_get(pcb->indice_stack,&i);
		//Puede ser null
		int tamanioArgs;
		if(stackAMandar->args!=NULL)
			tamanioArgs = list_size(stackAMandar->args);
		else
			tamanioArgs = -1;
		//Puede ser null
		int tamanioVars;
		if(stackAMandar->vars!=NULL)
			tamanioVars = list_size(stackAMandar->vars);
		else
			tamanioVars = -1;
		//Puede ser null
		int PIDretorno;
		if(stackAMandar->pos_ret!=NULL)
			PIDretorno = *(stackAMandar->pos_ret);//;
		else
			PIDretorno = -1;
		//Puede ser null
		direccionMemoria direccionRetornoFuncion;
		if(stackAMandar->memoriaRetorno!=NULL)
			direccionRetornoFuncion = 	*(stackAMandar->memoriaRetorno);
		else{
			direccionRetornoFuncion.offset = -1;
			direccionRetornoFuncion.pagina = -1;
			direccionRetornoFuncion.tamanio = -1;
		}

		enviarCPU(cpu,sizeof(int),&tamanioArgs,*(pcb->PID));
		enviarCPU(cpu,sizeof(int),&tamanioVars,*(pcb->PID));
		enviarCPU(cpu,sizeof(int),&PIDretorno,*(pcb->PID));
		enviarCPU(cpu,sizeof(direccionMemoria),&direccionRetornoFuncion,*(pcb->PID));
		int j;
		t_list* args = stackAMandar->args;
		for(j=0;j<tamanioArgs;j++){
			direccionMemoria* direccionMemoriaArg = list_get(args,j);
			enviarCPU(cpu,sizeof(direccionMemoria),direccionMemoriaArg,*(pcb->PID));
		}
		t_list* vars = stackAMandar->vars;
		for(j=0;j<tamanioVars;j++){
			direccionStack* direccionStackVars = list_get(vars,j);
			enviarCPU(cpu,sizeof(direccionStack),direccionStackVars,*(pcb->PID));
		}
	}

	enviarCPU(cpu,sizeof(int),&quantum,*(pcb->PID));
	enviarCPU(cpu,sizeof(int),&quantum_sleep,*(pcb->PID));

	//!!!!!!!!!!!!!!!!!!!!!!!!!
	//LIBERAR TODA MEMORIA PCB!
	//!!!!!!!!!!!!!!!!!!!!!!!!!

	return;
}
/*********************************************************************************************
F_SECUNDARIA: Creando un BSON del archivo, para insertalo en la DB                 TESTEADO =)
****************************/
bson_t * crearDocumentoParaLaDB(char * nombreDelArchivo, long tamanioDelArchivo, int dirPadreDelArchivo, t_dictionary * diccionarioDeBloques)
//Va eliminando el diccionario que ingresa por parametro :D
{
	bson_t child; bson_t child2; bson_t child3; bson_t child4;
	bson_oid_t oid;

	int cantidadTotalDeBloques;
	int identificadorDelBloque = 0;

	t_dictionary* copiasDelBloqueX;
	t_copiaX* copiaX;

	char * iDelBloque;
	//FIN DECLARACION DE VARIABLES


	bson_t * documento = bson_new();
	// ::: Estructura BASICA del documento :::
		bson_oid_init (&oid, NULL);
        BSON_APPEND_OID (documento, "_id", &oid);
		BSON_APPEND_UTF8 (documento, "nombreDelArchivo", nombreDelArchivo);
	 	BSON_APPEND_INT32 (documento, "tamanio", tamanioDelArchivo);
	 	BSON_APPEND_INT32 (documento, "dirPadre", dirPadreDelArchivo);
		BSON_APPEND_INT32 (documento, "estado", 1);

	cantidadTotalDeBloques = dictionary_size(diccionarioDeBloques);

		BSON_APPEND_INT32 (documento, "cantidadDeBloques", cantidadTotalDeBloques);
	// ::: Estructura de BLOQUES del documento :::
	//Guardando los N bloques con copias 3
	bson_append_document_begin (documento, "Bloques", 7, &child);

		while(identificadorDelBloque < cantidadTotalDeBloques)
		{
			iDelBloque = string_itoa(identificadorDelBloque);

			bson_append_document_begin (&child, iDelBloque, 1, &child2);

				copiasDelBloqueX = (t_dictionary*) dictionary_get( diccionarioDeBloques, iDelBloque );

				//Guardando la cantidad de copias del bloque X
					BSON_APPEND_INT32 (&child2, "cantidadDeCopias", 3);

				//Guardando las 3 copias para el bloque X
				bson_append_array_begin (&child2, "copias", 6, &child4);

					copiaX = (t_copiaX*) dictionary_get( copiasDelBloqueX, "1" );

					int Guachin= dictionary_size(copiasDelBloqueX);
					bson_append_document_begin (&child4, "0", 1, &child3);
						bson_append_int32(&child3,"IP", 2, (*copiaX).IP);
						bson_append_int32(&child3, "puerto", 6, (*copiaX).puerto);
						bson_append_int32(&child3, "numBloque", 9, (*copiaX).numBloque);
					bson_append_document_end (&child4, &child3);

					copiaX = (t_copiaX*) dictionary_get( copiasDelBloqueX, "2" );

					bson_append_document_begin (&child4, "1", 1, &child3);
						bson_append_int32(&child3,"IP", 2, (*copiaX).IP);
						bson_append_int32(&child3, "puerto", 6, (*copiaX).puerto);
						bson_append_int32(&child3, "numBloque", 9, (*copiaX).numBloque);
					bson_append_document_end (&child4, &child3);

					copiaX = (t_copiaX*) dictionary_get( copiasDelBloqueX, "3" );

					bson_append_document_begin (&child4, "2", 1, &child3);
						bson_append_int32(&child3,"IP", 2, (*copiaX).IP);
						bson_append_int32(&child3, "puerto", 6, (*copiaX).puerto);
						bson_append_int32(&child3, "numBloque", 9, (*copiaX).numBloque);
					bson_append_document_end (&child4, &child3);

				bson_append_array_end (&child2, &child4);

				dictionary_clean(copiasDelBloqueX);
				dictionary_destroy(copiasDelBloqueX);

			//Anido las 3 copias al bloque X
			bson_append_document_end (&child, &child2);

			free(iDelBloque);
			identificadorDelBloque++;
		};
	//::Estructura BASICA + estructura BLOQUES::
	bson_append_document_end (documento, &child);

	//Elimino el diccionarioDeBloques
	dictionary_clean(diccionarioDeBloques);
	dictionary_destroy(diccionarioDeBloques);

	return documento;
}