char* serializarFinQuantum(t_pcb *pcb, uint32_t *totalPaquete, char* resultadosDeEjecuciones) {
	uint32_t cabecera = FIN_QUANTUM;
	uint32_t offset=0;
	uint32_t tamanioenterosPCB, tamaniopath, tamanioCabecera, path, tamanioMensajes, tamanioCabeceraMensaje;
	tamanioenterosPCB = 4 * sizeof(uint32_t); //4 int de pcb
	tamaniopath = sizeof(uint32_t);
	tamanioCabecera = sizeof(cabecera);
	path = strlen(pcb->path);
	tamanioCabeceraMensaje = sizeof(uint32_t);
	tamanioMensajes = strlen(resultadosDeEjecuciones);
	*totalPaquete = tamanioCabecera + tamanioCabeceraMensaje + tamanioMensajes + tamanioenterosPCB + tamaniopath + path;
	char *paqueteSerializado = malloc(*totalPaquete);

	int medidaAMandar;
	medidaAMandar = tamanioCabecera;
	memcpy(paqueteSerializado + offset, &cabecera, medidaAMandar);
	offset += medidaAMandar;
	medidaAMandar = tamanioCabeceraMensaje ;
	memcpy(paqueteSerializado + offset, &tamanioMensajes, medidaAMandar);
	offset += medidaAMandar;
	medidaAMandar = tamanioMensajes;
	memcpy(paqueteSerializado + offset, resultadosDeEjecuciones, medidaAMandar);
	offset += medidaAMandar;
	return serializarPCB(pcb, offset, paqueteSerializado);
}
int main(void) {

	tipoPCB pcb;
		pcb.estado = 'm';
		pcb.insPointer = 123;
		pcb.pid = 100;
		pcb.ruta = "tuvieja";

	imprimirPCB(pcb);

	void* buffer = serializarPCB(pcb);

	tipoPCB pcbRecibido;
	deserializarPCB(buffer, &pcbRecibido);

	imprimirPCB(pcbRecibido);

	return EXIT_SUCCESS;
}
Beispiel #3
0
int main(int argc,char **argv){
	printf("%s", "\n\n****** INICIO CPU ******\n\n");
	sigusr1_desactivado=1;
	signal(SIGUSR1, sig_handler);
	signal(SIGINT, sig_handler2);
	log= log_create(ARCHIVOLOG, "CPU", 0, LOG_LEVEL_INFO);
	log_info(log,"Iniciando CPU\n");
	char* serializado;
	pthread_mutex_init(&mutex_pcb, NULL);
	t_paquete* paquete_recibido;

	levantar_configuraciones();
	umc = conectarConUmc();
	nucleo = conectarConNucleo();

	t_paquete* datos_kernel=recibir(nucleo);
	asignar_datos_de_nucleo(datos_kernel);
	liberar_paquete(datos_kernel);

	while(sigusr1_desactivado){
		log_info(log,"sigusr1: %d", sigusr1_desactivado);
		programaBloqueado = 0;
		programaFinalizado = 0;
		programaAbortado = 0;
		int quantum_aux=quantum;
		log_info(log,"Esperando Pcb\n");

		//while(sigusr1_desactivado){
		flag=1;
		datos_kernel=recibir(nucleo);
		asignar_datos_de_nucleo(datos_kernel);
		liberar_paquete(datos_kernel);
		flag=0;
		//}
		paquete_recibido = recibir(nucleo);
		log_info(log,"Deserializando PCB\n");
		pcb = desserializarPCB(paquete_recibido->data);
		log_info(log,"Recibi PCB del nucleo con el program counter en: %d y SizeContextoActual en %d\n", pcb->pc, pcb->sizeContextoActual);
		log_info(log,"Pcb pid: %d\n",pcb->pid);
		int pid = pcb->pid;
		var_max=(tamanioPag*(stack_size+pcb->paginasDeCodigo))-1;
		log_info(log, "Enviando pid %d a UMC\n",pcb->pid);
		enviar(umc, 3, sizeof(int), &pid);
		log_info(log, "Envie pid %d a UMC\n",pcb->pid);
		liberar_paquete(paquete_recibido);

		while((quantum_aux!=0) && !programaBloqueado && !programaFinalizado && !programaAbortado){

			t_direccion* datos_para_umc = malloc(12);
			crearEstructuraParaUMC(pcb, tamanioPag, datos_para_umc);
			log_info(log, "Direccion= Pag:%d Offset:%d Size:%d\n", datos_para_umc->pagina, datos_para_umc->offset, datos_para_umc->size);
			log_info(log, "Pido instruccion\n");
			char* sentencia=leer(datos_para_umc->pagina,datos_para_umc->offset, datos_para_umc->size);
			if(sentencia==NULL){
				programaAbortado=1;
				log_info(log,"Cambiando flag programaAbortado a %d\n", programaAbortado);
			}else{
			log_info(log, "Recibi instruccion de UMC con tamanio %d\n",  datos_para_umc->size);
			char* barra_cero="\0";
			memcpy(sentencia+( datos_para_umc->size-1), barra_cero, 1);

			log_info(log,"Tamanio sentencia: %d\n", strlen(sentencia));

			log_info(log,"Recibi sentencia: %s\n", depurarSentencia(sentencia));
			analizadorLinea(depurarSentencia(sentencia), &primitivas, &primitivas_kernel);
			free(datos_para_umc);
			free(sentencia);

			pcb->pc++;
			quantum_aux--;
			usleep(quantum_sleep*1000);
			}
			if (programaBloqueado){
				log_info(log, "El programa salió por bloqueo\n");
				log_info(log, "PC= %d\n", pcb->pc);
				serializado = serializarPCB(pcb);
				if(!sigusr1_desactivado){
					log_info(log,"mande el flag");
					int algo;
					enviar(nucleo,399,sizeof(int),algo);
					usleep(300*1000);
}
				enviar(nucleo, 340, ((t_pcb*)serializado)->sizeTotal, serializado);
				free(serializado);
				destruirPCB(pcb);
					}

			if (programaAbortado){
				log_info(log, "El programa aborto\n");
				log_info(log, "El pcb que sale por aborto tiene pid %d\n",pcb->pid);
				serializado = serializarPCB(pcb);
				if(!sigusr1_desactivado){
					log_info(log,"mande el flag");
					int algo;enviar(nucleo,399,sizeof(int),algo);usleep(1000*300);
				}
				enviar(nucleo, 370, ((t_pcb*)serializado)->sizeTotal, serializado);
				free(serializado);
				destruirPCB(pcb);
			}


			if((quantum_aux==0) &&!programaFinalizado&&!programaBloqueado&&!programaAbortado){

				log_info(log,"**Saliendo por fin de quantum\n");
				log_info(log,"**SizeContextoActual antes: %d\n", pcb->sizeContextoActual);
				serializado = serializarPCB(pcb);
				log_info(log,"SizeContextoActual despues: %d\n", pcb->sizeContextoActual);
				if(!sigusr1_desactivado){
					log_info(log,"mande el flag");
					int algo;enviar(nucleo,399,sizeof(int),algo);
					usleep(300*1000);
				}
				enviar(nucleo, 304, ((t_pcb*)serializado)->sizeTotal, serializado);
				free(serializado);
				destruirPCB(pcb);
				log_info(log,"destrui pcb\n");
			}

		}
	}

log_info(log,"Se cierra por senial SIGUSR1\n");
printf("SALI BIEN\n");

int algo2;enviar(nucleo,4,sizeof(int),algo2);
close(nucleo);
close(umc);
exit(EXIT_SUCCESS);

}