Exemplo n.º 1
0
int nro_linea_con_palabra(FILE *archivo, char* palabra){
	int i=-1;
	int encontrado=0;
	int cantidad_lineas=cant_lineas(archivo);
	//assert(cantidad_lineas==0 && "Se intenta buscar en un archivo vacío.");
	
	while(encontrado==0 && i<cantidad_lineas){
		i++;
		if(palabra_existe_en_linea(palabra, obtener_linea_pos(archivo,i))==1){
			encontrado=1;
		}
	}
	return i;
}
Exemplo n.º 2
0
void * PROCER_funcion(){
	id_hilo_procer=pthread_self();

	while(1){
		sem_wait(sem_procer);


			//printf("PROCER - Antes de sacar de listos hay %d procesos\n",cantidad_nodos(listaProcesosListos));
			//mostrar_lista(listaProcesosListos);

			pthread_mutex_lock(&mutexListaListos);
			proceso proceso=sacar_proceso(listaProcesosListos);
			pthread_mutex_unlock(&mutexListaListos);

			//printf("Saque el proceso %d de listos\n",proceso.pcb.pid);



			//printf("Se saco el proceso PID:%d de listos\n",proceso.pcb.pid);//TODO:BORRAR

			logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"LSCH","Se saco el proceso de la lista de Listos.");

			unsigned int cant_instrucciones = cant_lineas(proceso.pcb.codigo);
			char *instruccion;
			unsigned int cont_quantum = 0;
			int retorno;
			seccion seccion_a_ejecutar;


			while( verificar_fin_ejecucion(proceso,cont_quantum,cant_instrucciones) != -1){

			   if( proceso.pcb.pc == 0 ){//Es la 1° vez que ejecuta
				   agregar_a_pila_ejecucion(crear_seccion("fin_programa",&proceso.pcb.pc ),proceso.pila_ejecucion);
			   }
			   if( suspendido == 1){
				   pthread_mutex_lock(&mutexVarSuspendido);

				   suspendido = 0;
				   pthread_mutex_lock(&mutexVarMMP);
				   mmp--;
				   pthread_mutex_unlock(&mutexVarMMP);

				   logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"INFO","Se suspendio el proceso.");
				   pthread_mutex_lock(&mutexListaSuspendidos);
				   agregar_proceso(listaProcesosSuspendidos,proceso);
				   pthread_mutex_unlock(&mutexListaSuspendidos);
				   sem_post(sem_lts_suspendido);
				   logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"LSCH","Se agrego el proceso a la lista de Suspendidos.");

				   pthread_mutex_unlock(&mutexVarSuspendido);
				   break;
			   }else{//No se suspendio la ejecucion

				   seccion_a_ejecutar=sacar_primera_seccion(proceso.pila_ejecucion);
				   //printf("La instruccion extraida de la pila es %s\n",seccion_a_ejecutar.nombre_seccion);
				   if( strcmp(seccion_a_ejecutar.nombre_seccion,"") == 0){
					   logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"ERROR","Error al sacar la seccion a ejecutar, es nula.");
					   break;
				   }
					//Leemos la siguiente instruccion a ejecutar
					instruccion = leer_instruccion(proceso.pcb.codigo,*seccion_a_ejecutar.contador_instruccion);

					if( instruccion != NULL){
						//Calculo la proxima instruccion a leer
						++(*seccion_a_ejecutar.contador_instruccion);
						if( tengo_que_contar_quantum(instruccion) == 0){
							cont_quantum++;
						}

						if( strcmp(instruccion,seccion_a_ejecutar.nombre_seccion) != 0){//No es el fin de la seccion a ejecutar
							agregar_a_pila_ejecucion(seccion_a_ejecutar,proceso.pila_ejecucion);
						}

						if( strcmp(instruccion,"fin_programa") != 0){
							retorno = ejecutar_instruccion(instruccion,&proceso,&seccion_a_ejecutar);
							if( retorno == -1){
								char *error="Error al ejecutar instruccion: ";
								strcat(error,instruccion);
								logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"ERROR",error);
							}
							if( retorno == 1){//Quiere decir que se ejecuto una entrada/salida
								logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"INFO","Se fue a E/S.");
								break;
							}
						}else{
							logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"INFO","Finalizo la ejecucion");

							pthread_mutex_lock(&mutexVarMMP);
							--mmp;
							pthread_mutex_unlock(&mutexVarMMP);
							pthread_mutex_lock(&mutexVarMPS);
							--mps;
							pthread_mutex_unlock(&mutexVarMPS);

							//mostrar_datos(proceso.pcb.datos);
							if ( enviar_proceso_terminado(proceso) == 0){
								logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"INFO","Se enviao el estado del proceso al PI.");
							}else{
								logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"ERROR","Error al enviar el estado del proceso al PI.");
							}
							liberar_proceso(&proceso);
							logx(proceso.pcb.pid,"PROCER",id_hilo_procer,"INFO","Se libero la memoria del proceso.");
							break;
						}
					}
					bzero(instruccion,strlen(instruccion));
				}
			}
			cont_quantum=0;
	}
	return 0;
}