예제 #1
0
datos_personaje_t *removerPersonajePorSimbolo(datos_planificador_t *datosPlan,
		char simbolo) {
	int _is_personaje(datos_personaje_t *unPersonaje) {
		return unPersonaje->simbolo == simbolo;
	}

	datos_personaje_t *unPersonaje = NULL;

	pthread_mutex_lock(datosPlan->mutexColas);
	if (datosPlan->personajeEnMovimiento != NULL ) {
		if (datosPlan->personajeEnMovimiento->simbolo == simbolo) {
			unPersonaje = datosPlan->personajeEnMovimiento;
			datosPlan->personajeEnMovimiento = NULL;
			datosPlan->quantumCorriente = 0;
		}
	}

	if (unPersonaje == NULL ) {
		unPersonaje = list_remove_by_condition(
				datosPlan->personajesListos->elements, (void *) _is_personaje);
	}

	if (unPersonaje == NULL ) {
		unPersonaje = list_remove_by_condition(
				datosPlan->personajesBloqueados->elements,
				(void *) _is_personaje);
	}
	pthread_mutex_unlock(datosPlan->mutexColas);

	return unPersonaje;
}
예제 #2
0
void* hiloPCBaFinalizar() {
	while (1) {
		sem_wait(&semProgramaFinaliza);
		log_debug(log_pcp, "Debido a que se detuvo el programa %d, se envia el pcb a la cola de Exit", pcbAFinalizar);

		bool obtenerDeBloqueados(t_pcbBlockedSemaforo* pcbBlocked) {
			return pcbBlocked->pcb->pcb_id == pcbAFinalizar;
		}

		bool obtenerDeReady(t_pcb* pcbReady) {
			return pcbReady->pcb_id == pcbAFinalizar;
		}

		bool obtenerDeClientes(t_clienteCPU* cliente) {
			return cliente->pcbAsignado->pcb_id == pcbAFinalizar;
		}

		while (1) {

			t_pcbBlockedSemaforo* pcbBlock = list_remove_by_condition(listaBloqueados, (void*) obtenerDeBloqueados);
			if (pcbBlock != NULL ) {
				queue_push(colaExit, pcbBlock->pcb);
				sem_post(&semProgExit);
				sem_post(&semMultiProg);
				pthread_mutex_unlock(&mutex_exit);
				log_debug(log_pcp, "El pcb se encontraba en la cola de bloqueados");
				break;
			}

			t_pcb* pcb = list_remove_by_condition(colaReady->elements, (void*) obtenerDeReady);
			if (pcb != NULL ) {
				queue_push(colaExit, pcb);
				sem_post(&semProgExit);
				sem_post(&semMultiProg);
				pthread_mutex_unlock(&mutex_exit);
				log_debug(log_pcp, "El pcb se encontraba en la cola de ready");
				break;
			}

			t_clienteCPU* cliente = list_find(listaClientes, (void*) obtenerDeClientes);
			if (cliente != NULL ) {
				cliente->programaCerrado = true;
				cliente->fueAsignado=false;
				queue_push(colaExit, cliente->pcbAsignado);
				sem_post(&semProgExit);
				sem_post(&semMultiProg);
				pthread_mutex_unlock(&mutex_exit);
				log_debug(log_pcp, "El programa se encontraba en ejecucion");
				break;
			}

			sleep(2);
		}
	}
	return 0;
}
예제 #3
0
파일: Programa.c 프로젝트: mapeb/Marilu
bool destruirPrograma( Programa * programa )
{
	bool matchearPrograma(Programa *nodoPrograma)
	{
		return nodoPrograma->pid == programa->pid;
	}

		list_remove_by_condition( programas, matchearPrograma);

		if( programa != NULL)
		{
			log_info( logger, "Destruyendo programa con pid: %d", programa->pid);

			borrarSegmento( programa->stack );
			borrarSegmento( programa->script );

			if(programa->etiquetas != NULL)
			borrarSegmento( programa->etiquetas );

			borrarSegmento( programa->instrucciones );

			free( programa );

			return true;
		}else{
			log_error( logger, "El programa con pid: %d no se ha podido destruir", programa->pid);
			return false;
		}
}
//Se ejecuta funcion despues de validar, devuelve posicion pagina inicial
uint32_t ocuparEspacio(int32_t PID,int32_t paginasAOcupar)
{
	uint32_t posicionInicial;
	t_nodoLibre* nodoLibre;
	t_nodoOcupado* nodoOcupado = malloc(sizeof(t_nodoOcupado));
	nodoOcupado->paginas = paginasAOcupar;
	nodoOcupado->PID = PID;
	CantidadDePaginasCondicion = paginasAOcupar;
	nodoLibre = list_find(espacioLibre, validarEspacioLibre);
	nodoOcupado->comienzo = nodoLibre->comienzo;
	posicionInicial = nodoOcupado->comienzo;
	if(nodoLibre->paginas > paginasAOcupar)
	{
		nodoLibre->comienzo = nodoLibre->comienzo + paginasAOcupar;
		nodoLibre->paginas = nodoLibre->paginas - paginasAOcupar;
	}
	else
	{
		//Cantidad de paginas a ocupar es igual a cantidad libre
		NumeroDePaginaCondicion = nodoLibre->comienzo;
		nodoLibre = list_remove_by_condition(espacioLibre, validarUbicacionLibre);
		free(nodoLibre);
	}

	list_add(espacioOcupado,nodoOcupado);
	return posicionInicial;
}
예제 #5
0
int usarRecurso(char simboloRecurso, t_list *recursosLiberados,
		t_list *recursosUsados, char simboloPersonaje) {
	int _is_recurso(recurso_t *recurso) {
		return recurso->id == simboloRecurso;
	}

	recurso_t *recursoLiberado = list_find(recursosLiberados,
			(void *) _is_recurso);

	if (recursoLiberado != NULL ) {
		recursoLiberado->quantity--;
		personaje_recurso_t *personajeDesbloqueado = malloc(
				sizeof(personaje_recurso_t));
		personajeDesbloqueado->idRecurso = recursoLiberado->id;
		personajeDesbloqueado->idPersonaje = simboloPersonaje;
		list_add(recursosUsados, personajeDesbloqueado);

		if (recursoLiberado->quantity == 0) {
			list_remove_by_condition(recursosLiberados, (void *) _is_recurso);
			recurso_destroy(recursoLiberado);
		}
	}

	return recursoLiberado != NULL ;
}
예제 #6
0
void socket_multiplex(t_list* sockets) {
    struct epoll_event events[list_size(sockets)];
    int epollfd = epoll_create(list_size(sockets));
    
    void _add_elements(t_socket* socket) {
        struct epoll_event ev;
        ev.events = EPOLLIN | EPOLLRDHUP;
        ev.data.fd = socket->socket;
        epoll_ctl(epollfd, EPOLL_CTL_ADD, socket->socket, &ev);
    }

    list_iterate(sockets, (void*) _add_elements);
    
    int nfds = epoll_wait(epollfd, events, list_size(sockets), -1);
    for (int i = 0; i < nfds; ++i) {
        int sock_epoll = events[i].data.fd;
        uint32_t event = events[i].events;
        bool _search_by_socket(t_socket* socket) {
            return sock_epoll == socket->socket;
        }
        if (event & EPOLLRDHUP) {
            t_socket* sock_found = list_remove_by_condition(sockets, (void*) _search_by_socket);
            if (sock_found->handler_closed != NULL) {
                sock_found->handler_closed(sock_found);
            }
            free(sock_found);
        } else if (event & EPOLLIN) {
            t_socket* sock_found = list_find(sockets, (void*) _search_by_socket);
            sock_found->handler(sock_found);
        }
    }
    
    close(epollfd);
}
void cerrarMINivel(global tabla){
	bool _soyNID(nodoNivel*nivel){
		if(nivel->nid==tabla.cabecera->nid) return true;
		return false;
	}
	list_remove_by_condition(listaNiveles,(void*)_soyNID);
}
void threadDispositivo(stDispositivo* unDispositivo) {
	int error = 0;
	t_queue *colaRafaga;
	stRafaga *unaRafaga;
	stPCB *unPCB;

	colaRafaga = unDispositivo->rafagas;

	while (!error) {
		while (unDispositivo->numInq == 0)
			pthread_mutex_lock(&unDispositivo->empty);
		pthread_mutex_lock(&unDispositivo->mutex);		// Se lockea el acceso a la cola
		unaRafaga = queue_pop(colaRafaga);
		unDispositivo->numInq--;
		pthread_mutex_unlock(&unDispositivo->mutex);	// Se desbloquea el acceso a la cola

		log_info("Pedido I/O - Retardo de dispositivo [%s] con [%d].",unDispositivo->nombre,atoi(unDispositivo->retardo));
		usleep(atoi(unDispositivo->retardo)*unaRafaga->unidades*1000);

		/*Busqueda del pcb en la lista de pcb bloqueados*/
		int _es_el_pcb(stPCB *p) {
			return p->pid == unaRafaga->pid;
		}
		pthread_mutex_lock(&mutex_listaBlock);
		unPCB = list_remove_by_condition(listaBlock, (void*) _es_el_pcb);
		pthread_mutex_unlock(&mutex_listaBlock);

		/*Ponemos en la cola de Ready para que lo vuelva a ejecutar un CPU*/
		ready_productor(unPCB);
		log_info("El PCB [PID - %d] cambia de estado BLOCK a READY\n", unPCB->pid);
		free(unaRafaga);

	}
}
예제 #9
0
void BorrarItem(t_list* items, char id) {
    bool _search_by_id(ITEM_NIVEL* item) {
        return item->id == id;
    }
    
    list_remove_by_condition(items, (void*) _search_by_id);
}
void liberarProceso(int32_t PID)
{
	uint32_t byteInicial;
	uint32_t tamanio;
	t_nodoOcupado* nodoOcupado;
	pidCondicion = PID;
	nodoOcupado = list_remove_by_condition(espacioOcupado,validarMismoPid);
    byteInicial = nodoOcupado->comienzo * configuracion->tamano_pagina;
    tamanio = nodoOcupado->	paginas * configuracion->tamano_pagina;
    NumeroDePaginaCondicion = nodoOcupado->comienzo + nodoOcupado->paginas;
    t_nodoLibre* nodoLibre = list_find(espacioLibre,buscarNodoComienzo);
    if(nodoLibre == NULL)
    {
	nodoLibre = malloc(sizeof(t_nodoLibre));
    nodoLibre->comienzo = nodoOcupado->comienzo;
    nodoLibre->paginas = nodoOcupado->paginas;
    list_add(espacioLibre,nodoLibre);
    }
    else
    {
    	nodoLibre->comienzo = nodoOcupado->comienzo;
    	nodoLibre->paginas += nodoOcupado->paginas;
    }
    log_info(SwapLog,"Se libera proceso con PID %d, byte inicial %d y tamaño %d",PID,byteInicial,tamanio);
    free(nodoOcupado);
}
int verificar_Posicion(t_datosParaPedirInstancia *datos, t_list *listaDeCajas)
{
	char *recurso = malloc(strlen(datos->recurso) + 1);
	strcpy(recurso,datos->recurso);

	//busca en la lista de las cajas, la struct con el mismo recurso, para poder ver la posX y la posY

	bool es_Misma_Caja(t_datosCaja *ptr)
		{
			return strcmp(ptr->caja_letra, recurso) == 0;
		}

	t_datosCaja *datosCaja = list_remove_by_condition(listaDeCajas, (void *) es_Misma_Caja);

	//se fija si las posX y posY son iguales, tambien se fija si hay suficientes instancias
	if((datosCaja->caja_posx == datos->posX) && (datosCaja->caja_posy == datos->posY) && (datosCaja->caja_instancias > 0))
	{
		datosCaja->caja_instancias--; //TODO
		char letra = datosCaja->caja_letra[0];


		restarRecurso(ListaItems, letra); //parte grafica

		nivel_gui_dibujar(ListaItems);
		list_add(listaDeCajas, datosCaja);


		bool es_Mismo_Recurso(t_recursosDisponibles *ptr)
				{
					return strcmp(ptr->recurso_letra, recurso) == 0;
				}

	//edito la lista de recursos disponibles
	t_recursosDisponibles *recursoDisponible = list_remove_by_condition(listaDeRecursosDisponibles, (void *) es_Mismo_Recurso);

	recursoDisponible->recurso_instancias--;

	list_add(listaDeRecursosDisponibles, recursoDisponible);

		return YES;

	}else
예제 #12
0
void terminaDeFormaAbortiva(int pid_local) {
	//Ak aviso a consola
	int esEl_Pid(pcb_t* pcb_compara) {
		return (*pcb_compara->PID == pid_local);
	}
	printf("Se termino un CPU de forma abortiva\n");
	if (pid_local == -1) {

	} else {
		t_sock_mje* socketConsola;
		pthread_mutex_lock(&sem_l_Exec);
		pcb_t* pcb_elegido = list_remove_by_condition(proc_Exec,
				(void*) esEl_Pid);
		pthread_mutex_unlock(&sem_l_Exec);
		if(pcb_elegido == NULL){
			pthread_mutex_lock(&sem_temp);
				pcb_elegido = list_remove_by_condition(temp,
						(void*) esEl_Pid);
			pthread_mutex_unlock(&sem_temp);
			pthread_mutex_lock(&sem_l_Ready);
				list_add_in_index(proc_Ready, 0, pcb_elegido);
				log_debug(logger,"PCB con PID %d pasado al principio de READY xfin CPU",pid_local);
			pthread_mutex_unlock(&sem_l_Ready);
		}else{
		log_debug(logger, "PCB con PID %d sacado de EXEC xfin Proceso",
				pid_local);
		pthread_mutex_unlock(&sem_l_Exec);
		pthread_mutex_lock(&sem_l_Reject);
		list_add(proc_Reject, pcb_elegido);
		log_debug(logger, "PCB con PID %d pasado a EXIT xfin Proceso",
				pid_local);
		pthread_mutex_unlock(&sem_l_Reject);
		pthread_mutex_lock(&sem_pid_consola);
		socketConsola = dictionary_get(dict_pid_consola, &pid_local);
		pthread_mutex_unlock(&sem_pid_consola);
		free(socketConsola->mensaje);
		socketConsola->mensaje = strdup("123456");
		sem_post(&sem_REJECT_dispo);}
	}
	int a = 100;
	pthread_exit(&a);
}
예제 #13
0
void finalizar_job_a_si_mismo(t_job* job) {

	pthread_mutex_lock(&mutex_jobs);

	bool _job(t_job* jobLista) {
		return jobLista->id == job->id;
	}
	list_remove_by_condition(lista_jobs, (void*) _job);
	pthread_mutex_unlock(&mutex_jobs);
	pthread_exit(NULL);
}
예제 #14
0
int ansisop_wait (int socket_local, int pid_local){
	int* tamanioNombreWS = recibirCpu(socket_local,sizeof(int),pid_local);
	char* nombreSemaforo = recibirCpu(socket_local,*tamanioNombreWS,pid_local);
	pcb_t* pcb_elegido = recibirPCBdeCPU(socket_local,pid_local);
	int retorno=0;
	t_datos_samaforos* datos_sem;
	t_sock_mje* socketConsola;

	int esEl_Pid(pcb_t* pcb_compara) {
			return (*pcb_compara->PID==pid_local);
	}

	datos_sem = dictionary_get(reg_config.dic_semaforos,nombreSemaforo);
	pthread_mutex_lock(&datos_sem->semsem);
	if (datos_sem->valor > 0 && list_is_empty(datos_sem->cola_procesos)){
		(datos_sem->valor)-- ;
		retorno=0;
	}
	else if (datos_sem->valor <= 0) { // Bloqueo el proceso

		pthread_mutex_lock(&sem_l_Exec);
			list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
			log_debug(logger, "PCB con PID %d sacado de EXEC x bloqueo de Semaforo",pid_local);
		pthread_mutex_unlock(&sem_l_Exec);

		pthread_mutex_lock(&sem_pid_consola);
				socketConsola = dictionary_get(dict_pid_consola,&pid_local);
		pthread_mutex_unlock(&sem_pid_consola);

		if (socketConsola->proc_status==0){
			t_pcb_bloqueado* elem_block = malloc(sizeof(t_pcb_bloqueado));
			elem_block->pcb_bloqueado = pcb_elegido;
			elem_block->tipo_de_bloqueo = 2;
			elem_block->dispositivo = nombreSemaforo;
			elem_block->unidades = 0;
			pthread_mutex_lock(&sem_l_Block); // se bloquea
				list_add(proc_Block, elem_block);
				log_debug(logger, "PCB con PID %d pasado a cola BLOCK",pid_local);
			pthread_mutex_unlock(&sem_l_Block);
			sem_post(&sem_BLOCK_dispo);
		}
		else{
			pthread_mutex_lock(&sem_l_Reject);
				list_add(proc_Reject, pcb_elegido);
				log_debug(logger, "PCB con PID %d pasado a REJECT xfin de consola",pid_local);
			pthread_mutex_unlock(&sem_l_Reject);
			sem_post(&sem_REJECT_dispo);
		}

		retorno = 1; // retorna 1 si se bloquea el proceso para que cambie de PCB
	}
	pthread_mutex_unlock(&datos_sem->semsem);
	return retorno;
}
void remover_y_eliminar_conexion_cpu(uint32_t cpu_id)
{
	bool _cpu_por_id(void* elemento)
	{
		return ((conexion_cpu_t*) elemento)->id == cpu_id;
	}

	pthread_mutex_lock(&MUTEX_CONEXIONES_CPU);
	conexion_cpu_t* conn = list_remove_by_condition(CONEXIONES_CPU, _cpu_por_id);
	pthread_mutex_unlock(&MUTEX_CONEXIONES_CPU);

	cerrar_liberar(conn->socket);
	free(conn);
}
예제 #16
0
infoNodo* avanzarClock(infoNodo* worker, t_list* listaNodos){
	bool nodoConNumero(infoNodo* nodo){
		return nodo->numero == worker->numero;
	}

	infoNodo* siguienteWorker = malloc(sizeof(infoNodo));
	list_remove_by_condition(listaNodos, (void*)nodoConNumero);
	list_add_in_index(listaNodos, list_size(listaNodos), worker);

	siguienteWorker = list_get(listaNodos, 0);


	return siguienteWorker;
}
예제 #17
0
void planificar_turnos(t_planificador **direccion_planificador)
{
	t_planificador *planificador;
	planificador= *direccion_planificador;
	t_setColas *set = planificador->setColas;

	if (!queue_is_empty(set->colaListos)) //Si hay personajes listos para planificar.
	{

		if((planificador->socketPersonajeActual == -1 || (planificador->quantumsRestantes)==0)) //Si todavia nunca planifico o ya no quedan quantums
		{	pthread_mutex_lock(&set->semaforo);
		    sem_wait(&set->contadorDeListos);
			planificador->socketPersonajeActual =((t_personaje*) queue_peek(set->colaListos))->socket; //Miro al primer personaje de la cola
			sem_post(&set->contadorDeListos);
			pthread_mutex_unlock(&set->semaforo);
			planificador->quantumsRestantes=quantum; //Restauro el valor original de quantum
		}

		int respuestaDeTurno = enviar_permisoDeMovimiento(&planificador); //Le envio el turno

		(planificador->quantumsRestantes)--; //Decremento el quantum


		if(respuestaDeTurno == -1) //Si hubo algún error (el personaje se desconectó o no pudo responder por algún otro motivo)
		{
			t_personaje *personajeFalla;
			pthread_mutex_lock(&set->semaforo);
			sem_wait(&set->contadorDeListos);
			personajeFalla = (t_personaje *) queue_pop(set->colaListos); //Saco al personaje de la cola
			pthread_mutex_unlock(&set->semaforo);
			close(planificador->socketPersonajeActual);//Cierro su socket

			int _es_el_personaje(t_personaje* alguien)
			{
				return string_equals_ignore_case(alguien->remitente,personajeFalla->remitente);
			}
			pthread_mutex_lock(&semaforoConexiones);
			list_remove_by_condition(todosLosPersonajesConectados, (void*) _es_el_personaje); //Lo saco de los conectados
			log_info(planificador->logger,"%s se sacó de la lista de personajes conectados y de cola de listos porque hubo un error en recibir la respuesta de turno. \n", personajeFalla->remitente);
			loguearConectados(planificador);
			pthread_mutex_unlock(&semaforoConexiones);
			free(personajeFalla->remitente);
			free(personajeFalla);

		}
		else //Si no hubo errores
		{


			if(respuestaDeTurno==1) //Si luego del turno el personaje se bloqueó
예제 #18
0
void desbloquearPersonaje(datos_personaje_t *perDesbloqueado,
		datos_planificador_t *datosPlan) {
	int _is_personaje(datos_personaje_t *personaje) {
		return personaje->simbolo == perDesbloqueado->simbolo;
	}

	t_list *personajesBloqueados = datosPlan->personajesBloqueados->elements;
	t_queue *personajesListos = datosPlan->personajesListos;
	datos_personaje_t *personajeDesbloqueado = list_remove_by_condition(
			personajesBloqueados, (void *) _is_personaje);
	coordenadas_destroy(perDesbloqueado->coordObjetivo);
	perDesbloqueado->coordObjetivo = NULL;
	perDesbloqueado->objetivo = '\0';
	pthread_mutex_lock(datosPlan->mutexColas);
	queue_push(personajesListos, personajeDesbloqueado);
	pthread_mutex_unlock(datosPlan->mutexColas);
}
예제 #19
0
void ansisop_entradaSalida(int socket_local, int pid_local){

	//se recibe parametros para IO
	int* long_char = recibirCpu(socket_local,sizeof(int),pid_local);
	char * dispositivo = recibirCpu(socket_local, *long_char,pid_local);
	int * unidades = recibirCpu(socket_local,sizeof(int),pid_local);

	//se recibe el PCB
	pcb_t* pcb_bloqueado = recibirPCBdeCPU(socket_local,pid_local);

	t_sock_mje* socketConsola;

	pthread_mutex_lock(&sem_pid_consola);
			socketConsola = dictionary_get(dict_pid_consola,&pid_local);
	pthread_mutex_unlock(&sem_pid_consola);

	int esEl_Pid(pcb_t* pcb_compara) {
			return (*pcb_compara->PID==pid_local);
	}

	pthread_mutex_lock(&sem_l_Exec);
		list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
		log_debug(logger, "PCB con PID %d sacado de EXEC x bloqueo de IO",pid_local);
	pthread_mutex_unlock(&sem_l_Exec);

	if (socketConsola->proc_status==0){
		t_pcb_bloqueado* elem_block = malloc(sizeof(t_pcb_bloqueado));
		elem_block->pcb_bloqueado = pcb_bloqueado;
		elem_block->tipo_de_bloqueo = 1;
		elem_block->dispositivo = dispositivo;
		elem_block->unidades = * unidades;
		pthread_mutex_lock(&sem_l_Block); // se bloquea
			list_add(proc_Block, elem_block);
			log_debug(logger, "PCB con PID %d pasado a cola BLOCK",pid_local);
		pthread_mutex_unlock(&sem_l_Block);
		sem_post(&sem_BLOCK_dispo);
	}
	else{
		pthread_mutex_lock(&sem_l_Reject);
			list_add(proc_Reject, pcb_bloqueado);
			log_debug(logger, "PCB con PID %d pasado a REJECT xfin de consola",pid_local);
		pthread_mutex_unlock(&sem_l_Reject);
		sem_post(&sem_REJECT_dispo);
	}

}
예제 #20
0
void replanificarJobNuevoNodo(t_job* job, int idNodo, int idBloque) {

	bool by_idNodo(t_nodo* n) {
		return (*(n->id) == idNodo);
	}
	t_nodo* nodo = list_find(nodosList, (void*)by_idNodo);

	if(nodo != NULL){ //si el nodo al que le fallo el map no se desconecto

		bool _by_idNodo_idBloque(t_map* m) {
			return (*(m->idNodo) == *(nodo->id)) && (*(m->idBloque) == idBloque);
		}

		t_map* map = list_remove_by_condition(job -> maps, (void*)_by_idNodo_idBloque);

		replanificarMapFallado(job, map);

	}else{
void verificarKoopa(char *sPayload){
	tSimbolo *simbolo = deserializarSimbolo(sPayload);
	free(sPayload);

	log_info(logger, "El personaje %c finalizo su ejecucion", *simbolo);
	bool _search_symbol(t_estado_personaje *personaje){
		return(personaje->simbolo == *simbolo);
	}
	t_estado_personaje *personaje = list_remove_by_condition(personajes_jugando, (void *)_search_symbol);
	free(personaje);

	if(list_size(personajes_jugando) == 0){
		log_debug(logger, "No hay tipitos jugando entonces ejecuto koopa y cierro todo");
		cerrarTodo();
		executeKoopa(pathScript);
		exit(EXIT_SUCCESS);
	}

}
void eliminar_conexion_proceso(sock_t* conexion)
{
	bool _buscar_conexion(void* elemento)
	{
		return ((conexion_proceso_t*)elemento)->socket->fd == conexion->fd;
	}

	pthread_mutex_lock(&MUTEX_CONEXIONES_PROCESOS);

	conexion_proceso_t* conexionp = list_remove_by_condition(CONEXIONES_PROCESOS, _buscar_conexion);

	FD_CLR(conexion->fd, &READFDS_PROCESOS);

	pthread_mutex_unlock(&MUTEX_CONEXIONES_PROCESOS);

	loggear_desconexion_consola(conexionp->pid);

	cerrar_liberar(conexionp->socket);
	free(conexionp);
}
t_estadistica* sacarNodoEstadistica(int32_t PID)
{
	pidCondicion = PID;
	t_estadistica* nodo = list_remove_by_condition(estadisticasProcesos,compararNodoEstadistica);
	return nodo;
}
예제 #24
0
//------------------------------------------------------------------------------------------
// ---------------------------------- atender_CPU  -----------------------------------------
//Esta funcion representa un thread que trabaja con un CPU conectado por socket
//------------------------------------------------------------------------------------------
void *atender_CPU(int* socket_desc) {
	//void perdioLaConexion();
	//signal(SIGPIPE,perdioLaConexion);

	int socket_local = *socket_desc;

	//Empieza handshake
	int* recibido = recibirCpu(socket_local, sizeof(int),-1);
	if (*recibido == CPU) {
		log_debug(logger, "Se ha conectado correctamente CPU: %d",socket_local);
	}

	//Confirmo conexio a cpu
	int ok = OK;
	enviarCPU(socket_local,sizeof(int),&ok,-1);

	//Lo libero ya q era un malloc de atender_conexion_CPU
	free(socket_desc);
	int CpuActivo = 1; // 0 desactivado - 1 activado
	int cambioPcb = 0; // 0 desactivado - 1 activado
	pcb_t* pcb_elegido;
	int pid_local = 0;
	int* estado_proceso;
	t_sock_mje* socketConsola;
	int esEl_Pid(pcb_t* pcb_compara) {
			return (*pcb_compara->PID==pid_local);
	}

	while (CpuActivo) {
		//////////////////////////////////////////////
		//Le otorgo un pcb para tarabajar/////////////
		//////////////////////////////////////////////
		pid_local = -1;
		sem_wait(&sem_READY_dispo); // espero que haya un proceso en READY disponible


		pthread_mutex_lock(&sem_l_Ready);
			pcb_elegido = list_remove(proc_Ready, 0); //Agarro el pcb
			pid_local = *(pcb_elegido->PID);
			log_debug(logger, "PCB con PID %d sacado de READY", pid_local);
		pthread_mutex_unlock(&sem_l_Ready);

		pthread_mutex_lock(&sem_temp);
			list_add(temp,pcb_elegido); //Agarro el pcb
		pthread_mutex_unlock(&sem_temp);

		pthread_mutex_lock(&sem_pid_consola);
				socketConsola = dictionary_get(dict_pid_consola,&pid_local);
		pthread_mutex_unlock(&sem_pid_consola);

		cambioPcb = 0;
		if (socketConsola->proc_status!=0){ //verifico si se cerro la consola del proceso

			pthread_mutex_lock(&sem_l_Reject);
				list_add(proc_Reject, pcb_elegido);
				log_debug(logger, "PCB con PID %d pasado a REJECT xfin de consola",pid_local);
			pthread_mutex_unlock(&sem_l_Reject);
			sem_post(&sem_REJECT_dispo);
			cambioPcb = 1;
		}

		if(!cambioPcb){


			enviarPCB(pcb_elegido, socket_local, reg_config.quantum, reg_config.quantum_sleep);
			//Guardo pcb en la lista de ejecutandose
			pthread_mutex_lock(&sem_temp);
				list_remove_by_condition(temp, (void*) esEl_Pid);
			pthread_mutex_unlock(&sem_temp);

			pthread_mutex_lock(&sem_l_Exec);
				list_add(proc_Exec, pcb_elegido);
				log_debug(logger, "PCB con PID %d pasado a EXEC", pid_local);
			pthread_mutex_unlock(&sem_l_Exec);
		}
		while (!cambioPcb && CpuActivo){
			estado_proceso = recibirCpu(socket_local,sizeof(int),pid_local);
			switch (*estado_proceso) {
			case FIN_QUANTUM:
			{
				pcb_elegido = recibirPCBdeCPU(socket_local,pid_local);
				pthread_mutex_lock(&sem_l_Exec);
					list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
					log_debug(logger, "PCB con PID %d sacado de EXEC x fin Quantum",pid_local);
				pthread_mutex_unlock(&sem_l_Exec);
				//
				pthread_mutex_lock(&sem_l_Ready);
					list_add(proc_Ready, pcb_elegido);
					log_debug(logger, "PCB con PID %d pasado a READY x fin Quantum",pid_local);
				pthread_mutex_unlock(&sem_l_Ready);
				sem_post(&sem_READY_dispo);
				cambioPcb = 1;//activo el cambio del pcb ya q termino el quantum
			}
				break;
			case FIN_PROC:
			{
				pcb_elegido = recibirPCBdeCPU(socket_local,pid_local);
				pthread_mutex_lock(&sem_l_Exec);
					list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
					log_debug(logger, "PCB con PID %d sacado de EXEC xfin Proceso",	pid_local);
				pthread_mutex_unlock(&sem_l_Exec);
				//
				pthread_mutex_lock(&sem_l_Exit);
					list_add(proc_Exit, pcb_elegido);
					log_debug(logger, "PCB con PID %d pasado a EXIT xfin Proceso",pid_local);
				pthread_mutex_unlock(&sem_l_Exit);
				cambioPcb = 1;//activo el cambio del pcb ya q termino el proceso
				pthread_mutex_lock(&sem_pid_consola);
				socketConsola = dictionary_get(dict_pid_consola,&pid_local);
				pthread_mutex_unlock(&sem_pid_consola);
				free(socketConsola->mensaje);
				socketConsola->mensaje = strdup("Proceso_Finalizado_Correctamente");
				sem_post(&sem_EXIT_dispo);
			}
				break;
			case FIN_CPU:
			{
				pcb_elegido = recibirPCBdeCPU(socket_local,pid_local);
				pthread_mutex_lock(&sem_l_Exec);
					list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
					log_debug(logger, "PCB con PID %d sacado de EXEC xfin CPU",	pid_local);
				pthread_mutex_unlock(&sem_l_Exec);
				//
				pthread_mutex_lock(&sem_l_Ready);
					list_add_in_index(proc_Ready, 0, pcb_elegido);
					log_debug(logger,"PCB con PID %d pasado al principio de READY xfin CPU",pid_local);
				pthread_mutex_unlock(&sem_l_Ready);
				sem_post(&sem_READY_dispo);
				CpuActivo = 0;
			}
				//LIBERAR PCB
				//BORAR CONSOLA DEL DICCIONARIO
				break;
			case SOLIC_IO:	//es la primitiva entradaSalida
			{
                ansisop_entradaSalida(socket_local, pid_local);
                cambioPcb = 1;//activo el cambio del pcb ya q se bloqueo el proceso
			}
				break;
			case OBT_VALOR:  //es la primitiva obtenerValorCompartida
				ansisop_obtenerValorCompartida (socket_local,pid_local);
				break;
			case GRABA_VALOR: //es la primitiva asignarValorCompartida
				ansisop_asignarValorCompartida (socket_local,pid_local);
				break;
			case WAIT_SEM:	 // es la primitiva wait
			{
				cambioPcb = ansisop_wait (socket_local, pid_local);
				enviarCPU(socket_local,sizeof(int),&cambioPcb,pid_local);
				// si cambioPcb es 0 significa que el wait no bloqueo y el cpu puede seguir procesando,
				// si es 1 entonces el proceso se bloqueo y el CPU debe tomar otro PCB
				break;
			}

			case SIGNAL_SEM: // es la primitiva signal
				ansisop_signal(socket_local,pid_local);
				break;
			case IMPRIMIR: // es la primitiva imprimir
			{
				int* valoraImprimir = recibirCpu(socket_local,sizeof(int),pid_local);
			/*	t_sock_mje* */ socketConsola = dictionary_get(dict_pid_consola,&pid_local);
				int envVar = 100;
				if(socketConsola->proc_status == 0){
					enviarCPUConHeader(socketConsola->socket_dest,envVar,sizeof(int),valoraImprimir,pid_local);
				}
				free(valoraImprimir);
				break;
			}
			case IMPRIMIR_TXT: // es la primitiva imprimirTexto
			{
			/*	t_sock_mje* */ socketConsola = dictionary_get(dict_pid_consola,&pid_local);
				int* tamanioAImprimir = recibirCpu(socket_local,sizeof(int),pid_local);
				void* mensaje = recibirCpu(socket_local,*tamanioAImprimir,pid_local);
				int envTexto = 101;
				if(socketConsola->proc_status == 0){
					enviarCPUConHeader(socketConsola->socket_dest,envTexto,sizeof(int),tamanioAImprimir,pid_local);
					enviarCPU(socketConsola->socket_dest,*tamanioAImprimir,mensaje,pid_local);
				}
				free(tamanioAImprimir);
				free(mensaje);
				break;
			}
			case SEG_FAULT:
			{
				pcb_elegido = recibirPCBdeCPU(socket_local,pid_local);
				pthread_mutex_lock(&sem_l_Exec);
					list_remove_by_condition(proc_Exec, (void*) esEl_Pid);
					log_debug(logger, "PCB con PID %d sacado de EXEC xfin Proceso",	pid_local);
				pthread_mutex_unlock(&sem_l_Exec);
				pthread_mutex_lock(&sem_l_Reject);
					list_add(proc_Reject, pcb_elegido);
					log_debug(logger, "PCB con PID %d pasado a EXIT xfin Proceso",pid_local);
				pthread_mutex_unlock(&sem_l_Reject);
				cambioPcb = 1;//activo el cambio del pcb ya q termino el proceso
				pthread_mutex_lock(&sem_pid_consola);
					socketConsola = dictionary_get(dict_pid_consola,&pid_local);
				pthread_mutex_unlock(&sem_pid_consola);
				free(socketConsola->mensaje);
				socketConsola->mensaje = strdup("Proceso_Produjo_SEG_FAULT");
				sem_post(&sem_REJECT_dispo);
				break;
			}
			default:
				break;
			}
			free(estado_proceso);
		}
	}
}
예제 #25
0
//---------------------------------------------------------------------------
void hilo_reduce_job(t_reduce_dest* reduce_dest) {

	int result = 1;
	uint32_t answer_reduce = 0;

	mostrar_reduce_dest(reduce_dest);

	int _isNodoHost(t_reduce_nodo_dest* nodo) {
		return reduce_dest->id_nodo_host == nodo->id_nodo;
	}
	t_reduce_nodo_dest* nodo_host = list_remove_by_condition(reduce_dest->list_nodos, (void *)_isNodoHost);

	char *ip_nodo = from_int_to_inet_addr(nodo_host->ip_nodo);
	int socket_nodo = solicitarConexionConNodo(ip_nodo, nodo_host->puerto_nodo, nodo_host->id_nodo);

	if(socket_nodo != 1) {
		result = enviar_infoReduce_job(socket_nodo, reduce_dest, nodo_host);
		result = (result > 0) ? receive_answer_reduce(socket_nodo, &answer_reduce) : result;
	} else {
		answer_reduce = INCORRECT_NODO;
	}

	if(result <= 0) {
		answer_reduce = REDUCE_NOT_OK;
	}
	t_buffer* reduce_result_buff;

	switch(answer_reduce) {

		case REDUCE_OK: case REDUCE_NOT_OK:
			reduce_result_buff = buffer_create_with_protocol(answer_reduce);
			if(reduce_dest->prot == ORDER_PARTIAL_REDUCE) {
				buffer_add_int(reduce_result_buff, reduce_dest->id_nodo_host);
			}
			break;

		case INCORRECT_NODO:
			reduce_result_buff = buffer_create_with_protocol(NODO_NOT_FOUND);
			if(reduce_dest->prot == ORDER_REDUCE) {
				buffer_add_int(reduce_result_buff, 1);
				buffer_add_int(reduce_result_buff, nodo_host->id_nodo);
			}
			break;

		case NODO_NOT_FOUND:
			reduce_result_buff = buffer_create_with_protocol(NODO_NOT_FOUND);
			if(reduce_dest->prot == ORDER_REDUCE) {
				uint32_t i,amount_nodes = 0;
				result = receive_int_in_order(socket_nodo, &amount_nodes);
				buffer_add_int(reduce_result_buff, amount_nodes);

				for(i=0;(i<amount_nodes) && (result > 0); i++) {
					uint32_t id_nodo = 0;
					result = receive_int_in_order(socket_nodo, &id_nodo);
					buffer_add_int(reduce_result_buff, id_nodo);
				}

				if(result <= 0) {
					buffer_destroy(reduce_result_buff);
					reduce_result_buff = buffer_create_with_protocol(REDUCE_NOT_OK);
				}
			}
			break;

		case TEMP_NOT_FOUND:
			reduce_result_buff = buffer_create_with_protocol(TEMP_NOT_FOUND);
			uint32_t i,amount_temps = 0;
			result = receive_int_in_order(socket_nodo, &amount_temps);
			buffer_add_int(reduce_result_buff, amount_temps);
			for(i=0;(i<amount_temps) && (result > 0); i++) {
				uint32_t id_nodo = 0;
				result = receive_int_in_order(socket_nodo, &id_nodo);
				if(reduce_dest->prot == ORDER_REDUCE) {
					buffer_add_int(reduce_result_buff, id_nodo);
				}
				char* path = NULL;
				result = (result > 0) ? receive_dinamic_array_in_order(socket_nodo, (void **) &path) : result;
				if(path != NULL) {
					buffer_add_string(reduce_result_buff, path);
					free(path);
				}
			}

			if(result <= 0) {
				buffer_destroy(reduce_result_buff);
				reduce_result_buff = buffer_create_with_protocol(REDUCE_NOT_OK);
			}
			break;

		default:
			reduce_result_buff = buffer_create_with_protocol(REDUCE_NOT_OK);
			break;


	}

	if((socket_nodo != -1) && (result > 0)) {
		close(socket_nodo);
	}

	pthread_mutex_lock(&conex_marta_ready);
	result = (result > 0) ? send_buffer_and_destroy(socket_marta, reduce_result_buff) : result;
	pthread_mutex_unlock(&conex_marta_ready);


	free(ip_nodo);
	free_reduce_nodo_dest(nodo_host);
	free_reduce_dest(reduce_dest);
}
예제 #26
0
void eliminar_referencia(int page_referenced, t_proceso * proceso) {
	bool la_referenciada(int ref) {
		return (ref == page_referenced);
	}
	list_remove_by_condition(proceso->referencias, (void *) la_referenciada);
}
예제 #27
0
			}
		i++;
		}
	return item;
}


void  borrarPersonajeListaPersonajes(t_list * lista, char * simbolo){


	int32_t _esta_el_personaje(t_personaje_niv1 * personaje){

		return string_equals_ignore_case(personaje->simbolo,simbolo);
	}

	t_personaje_niv1 * pers = list_remove_by_condition(lista, (void*) _esta_el_personaje);
	personaje_destroy(pers);


}

void personaje_destroy(t_personaje_niv1 * pers){
	free(pers->posicion);
	//list_destroy(pers->recursosActuales);
	//free(pers->simbolo);
	free(pers);
}

t_personaje_niv1 * buscarPersonajeListaPersonajes(t_list * lista, char * simbolo){

예제 #28
0
파일: list.c 프로젝트: 1168392/exercises
/*
 * @NAME: list_remove_and_destroy_by_condition
 * @DESC: Remueve y destruye los elementos de la lista que hagan que condition devuelva != 0.
 */
void list_remove_and_destroy_by_condition(t_list *self, bool(*condition)(void*), void(*element_destroyer)(void*)) {
	void* data = list_remove_by_condition(self, condition);
	element_destroyer(data);
}
예제 #29
0
void procesar_mensaje (int sock_plataforma, int nro_nivel, t_paquete paqueteAux, t_list *ListaItems, t_list *ListaPersonajes, t_configNivel datosNivel, pthread_mutex_t *mutexListaItems, pthread_mutex_t *mutexListaPersonajes, pthread_mutex_t *mutexEnemigos, t_log *logger)
{
    switch(paqueteAux.selector)
    {
    case NUEVO_PERSONAJE:
    {
        t_nuevoPersonaje *nuevoPersonaje = (t_nuevoPersonaje *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        pthread_mutex_lock(mutexListaPersonajes);
        t_personaje *personaje = (t_personaje *) malloc(sizeof(t_personaje));
        personaje->personajeID = nuevoPersonaje->personajeID;
        personaje->nivelID = nuevoPersonaje->nivelID;
        personaje->recursosAsignados = list_create();
        personaje->recursosNecesitados = list_create();
        personaje->posX = 0;
        personaje->posY = 0;
        personaje->recursoBloqueante = '\0';
        personaje->prioridad = prioridad;
        ++prioridad;
        crearListaRecursosNecesitados(nuevoPersonaje->recursosNecesitados,personaje->recursosNecesitados);

        ITEM_NIVEL *itemPersonaje = malloc(sizeof(ITEM_NIVEL));
        itemPersonaje->id = nuevoPersonaje->personajeID;
        itemPersonaje->posx = 0;
        itemPersonaje->posy = 0;
        itemPersonaje->item_type = PERSONAJE_ITEM_TYPE;

        list_add(ListaItems,itemPersonaje);
        list_add(ListaPersonajes,personaje);
        nivel_gui_dibujar(ListaItems,datosNivel.nombre);
        pthread_mutex_unlock(mutexListaItems);
        pthread_mutex_unlock(mutexListaPersonajes);

        log_info(logger, "Personaje: %c conectado.", personaje->personajeID);

        break;
    }

    case UBICACION_RECURSO:
    {
        log_info(logger, "Mensaje UBICACION_RECURSO recibido.");

        t_ubicacionRecurso *ubicacionRecurso = (t_ubicacionRecurso *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        bool _funcBuscarRecurso(ITEM_NIVEL *item) {
            return item->id == ubicacionRecurso->recursoID;
        }
        ITEM_NIVEL *itemBuscado = list_find(ListaItems,(void *)_funcBuscarRecurso);
        pthread_mutex_unlock(mutexListaItems);

        ubicacionRecurso->posX = itemBuscado->posx;
        ubicacionRecurso->posY = itemBuscado->posy;

        t_paquete *paquete = empaquetar(UBICACION_RECURSO, sizeof(t_ubicacionRecurso), ubicacionRecurso);

        if(send(sock_plataforma,paquete,sizeof(t_paquete),0) == -1)
        {
            log_error(logger, "Error al enviar mensaje UBICACION_RECURSO.");
            exit(1);
        }

        free(paquete);

        log_info(logger, "Mensaje UBICACION_RECURSO enviado.");

        break;
    }

    case UBICACION_PERSONAJE:
    {
        log_info(logger, "Mensaje UBICACION_PERSONAJE recibido.");

        t_ubicacionPersonaje *ubicacionPersonaje = (t_ubicacionPersonaje *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        pthread_mutex_lock(mutexListaPersonajes);
        bool _funcBuscarEnListaItems(ITEM_NIVEL *personaje) {
            return personaje->id == ubicacionPersonaje->personajeID;
        }
        ITEM_NIVEL *itemPersonaje = list_find(ListaItems,(void *)_funcBuscarEnListaItems);
        bool _funcBuscarEnListaPersonajes(t_personaje *personaje) {
            return personaje->personajeID == ubicacionPersonaje->personajeID;
        }
        t_personaje *personaje = list_find(ListaPersonajes,(void *)_funcBuscarEnListaPersonajes);

        if((itemPersonaje != NULL) && (personaje != NULL))
        {
            itemPersonaje->posx = ubicacionPersonaje->posX;
            itemPersonaje->posy = ubicacionPersonaje->posY;

            personaje->posX = ubicacionPersonaje->posX;
            personaje->posY = ubicacionPersonaje->posY;

            bool _funcPisarEnemigo(ITEM_NIVEL *itemEnemigo)
            {
                if(itemEnemigo->item_type == ENEMIGO_ITEM_TYPE)
                {
                    return ((itemPersonaje->posx == itemEnemigo->posx) && (itemPersonaje->posy == itemEnemigo->posy));
                }

                return false;
            }

            bool muertePorEnemigo = list_any_satisfy(ListaItems, (void *) _funcPisarEnemigo);

            if(muertePorEnemigo)
            {
                t_victimaEnemigo victimaEnemigo;
                victimaEnemigo.personajeID = itemPersonaje->id;
                victimaEnemigo.nivelID = nro_nivel;

                t_paquete *paquete = empaquetar(VICTIMA_ENEMIGO, sizeof(t_victimaEnemigo), &victimaEnemigo);

                if(send(sock_plataforma, paquete, sizeof(t_paquete), 0) == -1)
                {
                    log_error(logger, "Error al enviar mensaje VICTIMA_ENEMIGO.");
                    exit(1);
                }

                free(paquete);

                log_info(logger, "Mensaje VICTIMA_ENEMIGO enviado.");
            }

            nivel_gui_dibujar(ListaItems,datosNivel.nombre);
            pthread_mutex_unlock(mutexListaItems);
            pthread_mutex_unlock(mutexListaPersonajes);
        }

        break;
    }

    case INSTANCIA_RECURSO:
    {
        log_info(logger, "Mensaje INSTANCIA_RECURSO recibido.");

        t_instanciaRecurso *instanciaRecurso = (t_instanciaRecurso *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        pthread_mutex_lock(mutexListaPersonajes);
        bool _funcBuscarRecursoEnItems(ITEM_NIVEL *rec) {
            return rec->id == instanciaRecurso->recursoID;
        }
        ITEM_NIVEL *itemRecurso = list_find(ListaItems,(void *)_funcBuscarRecursoEnItems);

        bool _funcBuscarPersonaje(t_personaje *pers) {
            return pers->personajeID == instanciaRecurso->personajeID;
        }
        t_personaje *personaje = list_find(ListaPersonajes,(void *)_funcBuscarPersonaje);

        if(personaje != NULL)
        {
            if(itemRecurso->quantity)
            {
                --itemRecurso->quantity;

                bool _funcBuscarRecurso(t_recurso *recurso) {
                    return recurso->recursoID == instanciaRecurso->recursoID;
                }
                t_recurso *recursoAsignado = list_find(personaje->recursosAsignados, (void *) _funcBuscarRecurso);
                t_recurso *recursoNecesitado = list_find(personaje->recursosNecesitados, (void *) _funcBuscarRecurso);

                if(recursoAsignado != NULL)
                {
                    ++recursoAsignado->cantidad;
                }
                else
                {
                    t_recurso *recurso = malloc(sizeof(t_recurso));
                    recurso->recursoID = instanciaRecurso->recursoID;
                    recurso->cantidad = 1;
                    list_add (personaje->recursosAsignados, recurso);
                }

                --recursoNecesitado->cantidad;

                if(recursoNecesitado->cantidad == 0)
                {
                    list_remove_by_condition(personaje->recursosNecesitados, (void *) _funcBuscarRecurso);
                }

                if (send(sock_plataforma,&paqueteAux,sizeof(t_paquete),0) == -1)
                {
                    log_error(logger, "Error al enviar mensaje RESPUESTA.");
                    exit(1);
                }

                log_info(logger, "Mensaje INSTANCIA_RECURSO enviado.");

            }
            else
            {
                personaje->recursoBloqueante = instanciaRecurso->recursoID;
            }
        }