void procesoDesBloqueado(int pIdHilo, int pPosicion){ obtenerSemaforoMemoria (semaforoIdBloqueado); limpiarMemoria(pPosicion, 0, bloqueado); liberarSemaforoMemoria(semaforoIdBloqueado); }
int start() { int opcion = 0; ArrayList *calendario = al_newArrayList(); cargarEventosDeArchivo(calendario); do { system("cls"); printMenu(); pedirInt(&opcion,"Ingrese una opcion:\n",7,1,"Ingrese una opcion valida. Entre 1 y 6\n"); switch(opcion) { case NUEVO: if(crearNuevoEvento(calendario)) printf("Hubo un error al intentar crear el evento\n"); pausa("Presione una tecla para volver\n"); break; case CONSULTAR_DIA: if(consultarFecha(calendario)) printf("Hubo un error con la consulta\n"); pausa("Presione una tecla para volver\n"); break; case MODIFICAR: if(modificarEvento(calendario)) printf("No se pudo completar la modificacion\n"); break; case ELIMINAR: if(eliminarEvento(calendario)) printf("No fue posible eliminar el evento\n"); pausa("Presione una tecla para volver\n"); break; case EXPORTAR: if(exportarCalendario(calendario)) printf("Hubo un error al intentar exportar el calendario\n"); pausa("Presione una tecla para volver\n"); break; case LIMPIAR: if(limpiarCalendario(calendario)) printf("No se pudo completar la operacion\n"); pausa("Presione una tecla para volver\n"); break; } }while( opcion != SALIR); guardarEventosEnArchivo(calendario); limpiarMemoria(calendario); calendario->deleteArrayList(calendario); return 0; }
void *CorrerHilo(void *pIdHilo){ int idHilo = *(int*)pIdHilo; int posicion = 0; int posicionBloqueado; int tiempoEspera = getRandom(LIMINFTIELIN, LIMSUPTIELIN); int cantidadLineas = getRandom(LIMINFLINEAS, LIMSUPLINEAS); union semun arg; printf(" Se creo el proceso %i ...\n",idHilo); /* Marca el proceso como bloqueado */ posicionBloqueado = procesoBloqueado(idHilo); /* Solicita el semaforo de memoria */ obtenerSemaforoMemoria (semaforoId); printf("El proceso %i bloqueo la memoria\n", idHilo); procesoDesBloqueado(idHilo, posicionBloqueado); /* Espera si esta en modo lectura */ while(semctl(semaforoIdLectura, 0, GETVAL, arg) == 0){ printf(" Esperando lectura\n"); sleep(1); } /* Marca el proceso que tiene acceso a la memoria */ obtieneAccesoMem(idHilo, accesoMemoria); /* Asigana el proceso a memoria */ posicion = ejecutaralgoritmo(idHilo,cantidadLineas); /* Verifica si encontro memoria */ if (posicion != -1){ /* Registra la accion en memoria */ escribirAccionBitacora(idHilo, "Asigna Memoria", obtenerTiempoActual(), posicion, cantidadLineas); }else printf("El proceso %i no encontro espacio en la memoria\n",idHilo); recorrerMemoria(datos,(int)*tamano); sleep(TIEMPOSLEEP); liberaAccesoMem(accesoMemoria); printf("El proceso %i des-bloqueo la memoria\n", idHilo); liberarSemaforoMemoria(semaforoId); /* Verifica que si encontro espacio */ if (posicion != -1){ printf("El proceso %i entro en espera\n", idHilo); sleep(tiempoEspera); printf(" Sacando proceso %i ...\n", idHilo); posicionBloqueado = procesoBloqueado(idHilo); obtenerSemaforoMemoria (semaforoId); printf("El proceso %i bloqueo la memoria\n", idHilo); procesoDesBloqueado(idHilo, posicionBloqueado); /* Espera si esta en modo lectura */ while(semctl(semaforoIdLectura, 0, GETVAL, arg) == 0){ printf(" Esperando lectura\n"); sleep(1); } obtieneAccesoMem(idHilo, accesoMemoria); /* Libera la memria que ocupaba el proceso */ limpiarMemoria(posicion, cantidadLineas, datos); escribirAccionBitacora(idHilo, "Desasigna Memoria",obtenerTiempoActual(),posicion,cantidadLineas); liberaAccesoMem(accesoMemoria); printf("El proceso %i des-bloqueo la memoria\n", idHilo); liberarSemaforoMemoria(semaforoId); } pthread_exit(NULL); }