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; }
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; }