tipoRespuesta* ejecutarInstruccion(tipoInstruccion* instruccion,t_list* listaDeHuecosOcupados, t_list* listaDeHuecosLibres, tipoConfigSWAP* configuracion){

	tipoRespuesta* respuesta;

	switch (instruccion->instruccion) {
		case INICIAR:
			respuesta = reservarEspacio(listaDeHuecosOcupados,listaDeHuecosLibres,instruccion->pid,instruccion->nroPagina,configuracion->cantidadDePaginas,configuracion->tamanioDePagina,configuracion->nombreDeSWAP);
			break;

		case LEER:
			respuesta = leerPagina(listaDeHuecosOcupados,instruccion->pid,instruccion->nroPagina,configuracion->tamanioDePagina,configuracion->nombreDeSWAP);
			break;

		case ESCRIBIR:
			respuesta = escribirPagina(listaDeHuecosOcupados,instruccion->pid,instruccion->texto,instruccion->nroPagina,configuracion->tamanioDePagina,configuracion->nombreDeSWAP);
			break;

		case FINALIZAR:
			respuesta = liberarEspacio(listaDeHuecosOcupados,listaDeHuecosLibres,instruccion->pid);
			break;
	}

	return respuesta;

}
void procesarEscritura(t_mensaje* detalle,sock_t* socketMemoria)
{
	pidCondicion = detalle->PID;
	int32_t status;
	int32_t resultado;
	bool buscar = list_any_satisfy(espacioOcupado,validarMismoPid);
	resultado = buscar;
	if(buscar == 1)
	{
		escribirPagina(detalle->contenidoPagina,detalle->PID,detalle->NumeroDePagina);
		aumentarEscritura(detalle->PID);
	}
	else
	{
		log_error(SwapLog,"No existe el proceso %d en memoria",detalle->PID);
	}
	status = send(socketMemoria->fd, &resultado, sizeof(int32_t),0);
	/*chequea envío*/
	if(!status)
	{
		printf("No se envió la cantidad de bytes a enviar luego\n");
	}
	free(detalle->contenidoPagina);
	usleep(deSegundoAMicroSegundos(configuracion->retardo_swap));
}
예제 #3
0
void escribir() {
	int* pid = recibirStream(socketAdministradorDeMemoria,sizeof(int));
	int* numeroPagina = recibirStream(socketAdministradorDeMemoria,sizeof(int));
	void* texto = recibirStream(socketAdministradorDeMemoria,
			swap_configuracion.TAMANIO_PAGINA);
	if (procesoSeEncuentraEnSwap(*pid)) {
		proceso proceso = obtenerProceso(*pid);
		if (*numeroPagina >= proceso.cantidadDePaginas) {
			printf(
					"La pagina %d no se encuentra en el proceso %d y no puede ser escrita\n",
					*numeroPagina, *pid);
			int fracaso = 7;
			send(socketAdministradorDeMemoria, &fracaso, sizeof(int), 0);
		} else {
			int paginaAEscribir = proceso.comienzo + *numeroPagina;
			logEscritura(paginaAEscribir,proceso.pid);
			escribirPagina(paginaAEscribir, texto);
			int exito = 6;
			send(socketAdministradorDeMemoria, &exito, sizeof(int), 0);
		}
	} else {
		printf("Proceso %d no se encuentra en Swap y no puede ser escrito\n",
				*pid);
		int fracaso = 7;
		send(socketAdministradorDeMemoria, &fracaso, sizeof(int), 0);
	}
	free(texto);
	free(pid);
	free(numeroPagina);
}
tipoRespuesta* ejecutarInstruccion(tipoInstruccion* instruccion,t_list* listaDeHuecosUtilizados,t_list* listaDeHuecosLibres,tipoConfigSWAP* configuracion, t_log* logger, bool* finalizarProceso){

	tipoRespuesta* respuesta;

	switch (instruccion->instruccion) {
		case INICIAR:
			respuesta = reservarEspacio(listaDeHuecosUtilizados,listaDeHuecosLibres,instruccion->pid,instruccion->nroPagina,configuracion->cantidadDePaginas,configuracion->tamanioDePagina,configuracion->nombreDeSWAP,configuracion->retardoDeCompactacion, logger);
			break;

		case LEER:
			respuesta = leerPagina(listaDeHuecosUtilizados,instruccion->pid,instruccion->nroPagina,configuracion->tamanioDePagina,configuracion->nombreDeSWAP, logger,configuracion->retardoDeSWAP);
			break;

		case ESCRIBIR:
			respuesta = escribirPagina(listaDeHuecosUtilizados,instruccion->pid,instruccion->texto,instruccion->nroPagina,configuracion->tamanioDePagina,configuracion->nombreDeSWAP, logger,configuracion->retardoDeSWAP);
			break;

		case FINALIZAR:
			respuesta = liberarEspacio(listaDeHuecosUtilizados,listaDeHuecosLibres,instruccion->pid, configuracion->tamanioDePagina, logger,configuracion->nombreDeSWAP);
			break;

		case FINALIZAR_PROCESO:
			respuesta = finalizarProcesoSWAP(finalizarProceso);
			break;
	}

	return respuesta;

}