void inicializar_CPU(char *path, uint32_t *retardo) {
t_config* config = config_create(path);
*retardo = config_get_int_value(config,"RETARDO");
uint16_t puertoMSP = config_get_int_value(config,"PUERTO_MSP");
char *direccionIpMSP = config_get_string_value(config,"IP_MSP");
uint16_t puertoKernel = config_get_int_value(config,"PUERTO_KERNEL");
char *direccionIpKernel = config_get_string_value(config,"IP_KERNEL");
if((Kernel = client_socket(direccionIpKernel, puertoKernel)) < 0) {
puts("ERROR: No se pudo conectar al Kernel.");
exit(EXIT_FAILURE);
}
t_msg *handshake = id_message(CPU_CONNECT);
enviar_mensaje(Kernel, handshake);
destroy_message(handshake);
if((MSP = client_socket(direccionIpMSP, puertoMSP)) < 0) {
puts("ERROR: No se pudo conectar a la MSP.");
exit(EXIT_FAILURE);
}
config_destroy(config);
MapRegistros['A'-'A'] = &Registros.registros_programacion[0];
MapRegistros['B'-'A'] = &Registros.registros_programacion[1];
MapRegistros['C'-'A'] = &Registros.registros_programacion[2];
MapRegistros['D'-'A'] = &Registros.registros_programacion[3];
MapRegistros['E'-'A'] = &Registros.registros_programacion[4];
MapRegistros['K'-'A'] = &Registros.K;
MapRegistros['I'-'A'] = &Registros.I;
MapRegistros['M'-'A'] = &Registros.M;
MapRegistros['P'-'A'] = &Registros.P;
MapRegistros['S'-'A'] = &Registros.S;
MapRegistros['X'-'A'] = &Registros.X;
inicializar_tabla_instrucciones();
}
void devolver_hilo() {
t_msg *msg = Kernel_Msg == NULL ? tcb_message(Execution_State, &Hilo, 0) : Kernel_Msg;
if(enviar_mensaje(Kernel, msg) == -1) {
puts("ERROR: No se pudo enviar el TCB del hilo en ejecución al Kernel.");
exit(EXIT_FAILURE);
}
destroy_message(msg);
Kernel_Msg = NULL;
}
void ejecuta_reduce(t_job* job, t_reduce* reduce) {
	char* stream = string_duplicate(reduce->arch_tmp.nodo.ip);
	string_append(&stream, "|");
	string_append(&stream, reduce->arch_tmp.nodo.nombre);
	string_append(&stream, "|");
	string_append(&stream, string_duplicate(reduce->arch_tmp.nombre));
	t_msg* message = string_message(EJECUTAR_REDUCE, stream, 3, reduce->arch_tmp.nodo.puerto, reduce->id, job->id);
	reduce->estado = EN_EJECUCION;
	enviar_mensaje(job->socket, message);

	void _genera_mensaje(t_temp* temp) {
		stream = string_duplicate(temp->nodo.ip);
		string_append(&stream, "|");
		string_append(&stream, temp->nodo.nombre);
		string_append(&stream, "|");
		string_append(&stream, string_duplicate(temp->nombre));
		t_msg* message = string_message(ARCHIVOS_NODO_REDUCE, stream, 1, temp->nodo.puerto);
		enviar_mensaje(job->socket, message);
	}
void *loader(void *arg)
{
	while (1) {
		if(sem_wait(&sem_loader) == -1) {
			perror("loader");
			exit(EXIT_FAILURE);
		}

		if(!thread_alive)
			return NULL;

		pthread_mutex_lock(&loader_mutex);
		t_msg *recibido = queue_pop(loader_queue);
		pthread_mutex_unlock(&loader_mutex);

		t_console *console = new_console(recibido->argv[0]);

		pthread_mutex_lock(&console_list_mutex);
		list_add(console_list, console);
		pthread_mutex_unlock(&console_list_mutex);

		conexion_consola(console->pid);
		log_trace(logger_old, "[NEW_CONNECTION @ LOADER]: (CONSOLE_ID %u, CONSOLE_SOCK %u).", console->pid, console->sock_fd);

		t_hilo *new_tcb = ult_tcb(console->pid);
		int status = reservar_memoria(new_tcb, recibido);
		if (status == -1) {
			log_warning(logger_old, "No se pudo cargar a memoria el hilo principal de la Consola %u.", console->pid);
			
			new_tcb->cola = EXIT;
			list_add(process_list, new_tcb);

			t_msg *msg = string_message(KILL_CONSOLE, "Finalizando consola. Motivo: no hay espacio suficiente en MSP.", 0);
			if(enviar_mensaje(console->sock_fd, msg) == -1) {
				log_warning(logger_old, "Se perdio la conexion con la consola %u.", console->pid);
				remove_console_by_sock_fd(console->sock_fd);
			}
			destroy_message(msg);
		} else {
			pthread_mutex_lock(&process_list_mutex);
			list_add(process_list, new_tcb);
			pthread_mutex_unlock(&process_list_mutex);

			log_trace(logger_old, "[LOADER]: (PID %u, TID %u) => NEW.", new_tcb->pid, new_tcb->tid);

			sem_post(&sem_planificador);
		}
	}
	
	return NULL;
}
void obtener_siguiente_hilo(void) {
t_msg *msg = id_message(CPU_TCB);
if(enviar_mensaje(Kernel,msg) == -1) {
puts("ERROR: No se pudo obtener el siguiente hilo a ejecutar.");
exit(EXIT_FAILURE);
}
destroy_message(msg);
if((msg = recibir_mensaje(Kernel)) == NULL || msg->header.id != NEXT_TCB) {
puts("ERROR: No se pudo obtener el siguiente hilo a ejecutar.");
exit(EXIT_FAILURE);
}
Quantum = msg->argv[0];
Execution_State = RETURN_TCB;
memcpy(&Hilo,msg->stream,sizeof(t_hilo));
destroy_message(msg);
}
Example #6
0
/**
 * Rutina de recuperación del svr_c
 * @param  nroPuerto puerto de conexion al servidor
 * @param  he Nombre del servidor al que se enviara el mensaje
 * @return 0 si tuvo exito -1 si no
 */
int recuperar(int nroPuerto, struct hostent *he){
  FILE *archRec = fopen(RECUPERA,"r");
  char *mensaje = Pedir_Memoria(BUFFER_LEN);
  while (feof(archRec)==0){    
    sleep(1);
    fgets(mensaje,BUFFER_LEN,archRec);
    mensaje[strlen(mensaje)-1]='\0';
    printf("%s\n",mensaje);
    if (enviar_mensaje(nroPuerto,he,mensaje)==-1){
      fclose(archRec);
      return -1;
    }
  }
  fclose(archRec);
  free(mensaje);
  return 0;
}
void destruir_segmento(uint32_t baseSegmento) {
t_msg *msg = argv_message(DESTROY_SEGMENT,2,PID,baseSegmento);
if(enviar_mensaje(MSP,msg) == -1) {
puts("ERROR: Se ha perdido la conexión con la MSP.");
exit(EXIT_FAILURE);
}
destroy_message(msg);
if((msg = recibir_mensaje(MSP)) == NULL) {
puts("ERROR: Se ha perdido la conexión con la MSP.");
exit(EXIT_FAILURE);
}
if(msg->header.id != OK_DESTROY) {
Quantum = 0;
KernelMode = false;
Execution_State = CPU_ABORT;
}
destroy_message(msg);
}
int main(void) {
	t_msg *msg[100];
	int sock_fd = client_socket("127.0.0.1", 1122);
	if(sock_fd < 0) {
		puts("No se pudo conectar con el Kernel.");
		return 1;
	}
	int i;
	for(i = 0; i < 100; i++)
		msg[i] = beso_message(KILL_CONSOLE, "../file.bin", 0);

	for(i = 0; i < 100; i++) {
		int j = enviar_mensaje(sock_fd, msg[i]);
		printf("Enviado mensaje nro. %d, length %d.\n", i + 1, j);
		destroy_message(msg[i]);
	}

	return 0;
}
void escribir_memoria(uint32_t pid,uint32_t direccionLogica,char *bytesAEscribir,uint32_t size) {
t_msg *msg = string_message(WRITE_MEMORY,bytesAEscribir,2,pid,direccionLogica);
msg->header.length = size;
if(enviar_mensaje(MSP,msg) == -1) {
puts("ERROR: Se ha perdido la conexión con la MSP.");
exit(EXIT_FAILURE);
}
destroy_message(msg);
free(bytesAEscribir);
if((msg = recibir_mensaje(MSP)) == NULL) {
puts("ERROR: Se ha perdido la conexión con la MSP.");
exit(EXIT_FAILURE);
}
if(msg->header.id != OK_WRITE) {
Quantum = 0;
KernelMode = false;
Execution_State = CPU_ABORT;
}
destroy_message(msg);
}
void handshakeMarta() {
	char* str_mensaje = string_new();
	int ret;
	string_append(&str_mensaje, configuracion->resultado);
	string_append(&str_mensaje, "|");
	string_append(&str_mensaje, configuracion->archivos);
	t_msg* mensaje = string_message(CONEXION_JOB, str_mensaje, 1, configuracion->combiner);

	log_debug_interno("Enviando mensaje de solicitud de inicio de Job a MaRTA. Header.ID: %s - Archivos: %s - Resultado: %s", id_string(CONEXION_JOB),
			configuracion->archivos, configuracion->resultado);

	ret = enviar_mensaje(marta_sock, mensaje);

	if (ret < 0) {
		log_error_consola("Fallo el envio de mensaje de solicitud de inicio de Job");
		exit(1);
	}

	destroy_message(mensaje);
}
void ejecuta_maps(t_job* job) {

	void _ejecuta_map(t_map* map) {
		if (map->estado == PENDIENTE || map->estado == FIN_ERROR) {
			char* stream = string_duplicate(map->arch_tmp.nodo.ip);
			string_append(&stream, "|");
			string_append(&stream, map->arch_tmp.nodo.nombre);
			string_append(&stream, "|");
			string_append(&stream, string_duplicate(map->arch_tmp.nombre));
			t_msg* message = string_message(EJECUTAR_MAP, stream, 4, map->arch_tmp.nodo.puerto, map->id, job->id, map->arch_tmp.nodo.numero_bloque);
			map->estado = EN_EJECUCION;
			enviar_mensaje(job->socket, message);
			log_info_interno("Enviando MAP. job: %d, id_operacion: %d, ip_nodo: %s,puerto_nodo: %d, bloque: %d,nombre_temp: %s", job->id, map->id,
					map->arch_tmp.nodo.ip, map->arch_tmp.nodo.puerto, map->arch_tmp.nodo.numero_bloque, map->arch_tmp.nombre);
			destroy_message(message);
		}
	}
	log_debug_consola("creando map threads. Job: %d", job->id);
	list_iterate(job->maps, (void*) _ejecuta_map);
	log_debug_consola("map threads creados. Job: %d", job->id);
}
uint32_t crear_segmento(uint32_t size) {
uint32_t aux;
t_msg *msg = argv_message(CREATE_SEGMENT,2,PID,size);
if(enviar_mensaje(MSP,msg) == -1) {
puts("ERROR: Se ha perdido la conexión con la MSP.");
exit(EXIT_FAILURE);
}
destroy_message(msg);
if((msg = recibir_mensaje(MSP)) == NULL) {
puts("ERROR: Se ha perdido la conexión con la MSP.");
exit(EXIT_FAILURE);
}
if(msg->header.id == OK_CREATE)
aux = (uint32_t) msg->argv[0];
else {
Quantum = 0;
KernelMode = false;
Execution_State = CPU_ABORT;
}
destroy_message(msg);
return aux;
}
main() {

	char * id;
	int fd = client_socket("127.0.0.1",2233);

	while(getchar() != EOF) {

		t_msg *msg = argv_message(REQUEST_MEMORY, 3, 74, 127, 30);
		
		enviar_mensaje(fd,msg);

		puts("Mensaje enviado");

		msg = recibir_mensaje(fd);

		printf("%s\n%s",id = id_string(msg->header.id),msg->stream);

		free(msg);
	
	}

}
char* solicitar_memoria(uint32_t pid,uint32_t direccionLogica,uint32_t size) {
char *buffer = malloc(size);
t_msg *msg = argv_message(REQUEST_MEMORY,3,pid,direccionLogica,size);
if(enviar_mensaje(MSP,msg) == -1) {
puts("ERROR: Se ha perdido la conexión con la MSP.");
exit(EXIT_FAILURE);
}
destroy_message(msg);
if((msg = recibir_mensaje(MSP)) == NULL) {
puts("ERROR: Se ha perdido la conexión con la MSP.");
exit(EXIT_FAILURE);
}
if(msg->header.id == OK_REQUEST)
memcpy(buffer,msg->stream,size);
else {
free(buffer);
buffer = NULL;
Quantum = 0;
KernelMode = false;
Execution_State = CPU_ABORT;
}
destroy_message(msg);
return buffer;
}
int hiloMap(void* dato) {
	//sumar_hilo();
	t_msg* mensaje;
	t_msg* mensaje_respuesta;
	t_params_hiloMap* args = (t_params_hiloMap*) dato;
	int nodo_sock = client_socket(args->ip, args->puerto);
	int res = 0;

	if (nodo_sock < 0) {
		log_error_consola("No se pudo conectar al proceso %s - IP: %s - Puerto: %d", args->nombre_nodo, args->ip, args->puerto);
		mensaje_respuesta = argv_message(FIN_MAP_ERROR, 2, args->id_operacion, args->id_job);
	} else {

		mensaje = string_message(EJECUTAR_MAP, args->archivo_final, 2, args->id_operacion, args->bloque);

		log_debug_interno("Enviando mensaje de solicitud de reduce. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id),
				mensaje->header.argc, mensaje->header.length);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje EJECUTAR_MAP");
			shutdown(nodo_sock, 2);
		}
		mensaje = rutina_message(RUTINA, configuracion->mapper, configuracion->tamanio_mapper);

		log_debug_interno("Enviando mensaje de rutina. Header.ID: %s - Argc: %d - Largo Stream: %d Al nodo: %s", id_string(mensaje->header.id),
				mensaje->header.argc, mensaje->header.length, args->nombre_nodo);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje RUTINA");
			shutdown(nodo_sock, 2);
		}
		log_info_consola("Se envio SOLICITUD DE MAP correctamente. id_op: %d, nodo: %s", args->id_operacion, args->nombre_nodo);
		mensaje = recibir_mensaje_sin_mutex(nodo_sock);
		if (!mensaje) { //Significa que recibir_mensaje devolvio NULL o sea que hubo un error en el recv o el nodo se desconecto
			log_info_consola("El MAP id_op: %d en el nodo: %s fallo, enviando a MaRTA", args->id_operacion, args->nombre_nodo);
			mensaje_respuesta = argv_message(FIN_MAP_ERROR, 2, args->id_operacion, args->id_job);
		} else {
			log_info_consola("El MAP id_op: %d, en el nodo: %s finalizo bien. enviando a MaRTA", args->id_operacion, args->nombre_nodo);
			mensaje_respuesta = argv_message(mensaje->header.id, 2, args->id_operacion, args->id_job);
			log_debug_interno("Se recibio mensaje de %s. Header.Id: %s - Argc: %d - Largo Stream: %d", args->nombre_nodo, id_string(mensaje->header.id),
					mensaje->header.argc, mensaje->header.length);
			destroy_message(mensaje);
		}
	}
//Se envia el resultado del map a marta
	log_debug_interno("Enviando mensaje respuesta a MaRTA. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje_respuesta->header.id),
			mensaje_respuesta->header.argc, mensaje_respuesta->header.length);

	res = enviar_mensaje(marta_sock, mensaje_respuesta);
	if (res == -1) {
		log_error_consola("Fallo envio de Mensaje a MaRTA.");
		shutdown(nodo_sock, 2);
		return res;
	}
	log_info_consola("Respuesta MAP enviada a MaRTA. id_op: %d, nodo: %s", args->id_operacion, args->nombre_nodo);
	destroy_message(mensaje_respuesta);

//CERRAR CONEXIoN CON EL NODO//
	shutdown(nodo_sock, 2);
	//restar_hilo();
	return res;
}
int hiloReduce(void* dato) {
	//sumar_hilo();
	t_msg* mensaje;
	t_msg* mensaje_respuesta;
	int res = 0;
	int i;
	t_params_hiloReduce* args = (t_params_hiloReduce*) dato;
	int nodo_sock = client_socket(args->ip, args->puerto);

	if (nodo_sock < 0) {
		log_error_consola("No se pudo conectar al proceso %s - IP: %s - Puerto: %d", args->nombre_nodo, args->ip, args->puerto);
		mensaje_respuesta = argv_message(FIN_REDUCE_ERROR, 1, args->id_operacion);
	} else {

		log_debug_consola("Se conecto al proceso %s - IP: %s - Puerto: %d", args->nombre_nodo, args->ip, args->puerto);

		mensaje = string_message(EJECUTAR_REDUCE, args->archivo_final, 1, args->id_operacion);
		log_debug_interno("Enviando mensaje de solicitud de reduce. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id),
				mensaje->header.argc, mensaje->header.length);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje EJECUTAR_REDUCE");
			shutdown(nodo_sock, 2);
			return res;

		}

		mensaje = rutina_message(RUTINA, configuracion->reduce, configuracion->tamanio_reduce);

		log_debug_interno("Enviando mensaje rutina. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id), mensaje->header.argc,
				mensaje->header.length);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje RUTINA");
			shutdown(nodo_sock, 2);
			return res;
		}

		int cant_elementos = queue_size(args->archivos_tmp);
		for (i = 0; i < cant_elementos; i++) {
			mensaje = queue_pop(args->archivos_tmp);
			log_debug_interno("Enviando mensaje archivos de reduce. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id),
					mensaje->header.argc, mensaje->header.length);

			res = enviar_mensaje(nodo_sock, mensaje);
			if (res == -1) {
				log_error_consola("Fallo envio mensaje ARCHIVOS_NODOS_REDUCE");
				shutdown(nodo_sock, 2);
				return res;
			}
		}

		mensaje = id_message(FIN_ENVIO_MENSAJE);

		log_debug_interno("Enviando mensaje fin de Mensaje. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id), mensaje->header.argc,
				mensaje->header.length);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje FIN_ENVIO_MENSAJE");
			shutdown(nodo_sock, 2);
			return res;
		}
		log_info_consola("Envio REDUCE a Job OK. id_op:%d , nodo: %s ", args->id_operacion, args->nombre_nodo);
		mensaje = recibir_mensaje_sin_mutex(nodo_sock);

		if (!mensaje) { //Significa que recibir_mensaje devolvio NULL o sea que hubo un error en el recv o el nodo se desconecto
			log_info_consola("Respuesta REDUCE Error. id_op: %d, nodo: %s, enviando mensaje a MaRTA", args->id_operacion, args->nombre_nodo);
			mensaje_respuesta = argv_message(FIN_REDUCE_ERROR, 2, args->id_operacion, args->id_job);
		} else {
			log_info_consola("Respuesta REDUCE OK. id_op: %d, nodo: %s, enviando mensaje a MaRTA", args->id_operacion, args->nombre_nodo);
			mensaje_respuesta = argv_message(mensaje->header.id, 2, args->id_operacion, args->id_job);
			log_debug_interno("Se recibio mensaje de %s. Header.Id: %s - Argc: %d - Largo Stream: %d", args->nombre_nodo, id_string(mensaje->header.id),
					mensaje->header.argc, mensaje->header.length);
		}
	}

//Se reenvia el resultado del reduce a marta
	log_debug_interno("Enviando mensaje respuesta a MaRTA. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje_respuesta->header.id),
			mensaje_respuesta->header.argc, mensaje_respuesta->header.length);

	res = enviar_mensaje(marta_sock, mensaje_respuesta);
	if (res == -1) {
		log_error_consola("fallo mensaje respuesta a MaRTA");
		shutdown(nodo_sock, 2);
		return res;
	}
	log_info_consola("Respuesta REDUCE enviada. id_op: %d, nodo: %s", args->id_operacion, args->nombre_nodo);
	destroy_message(mensaje_respuesta);

	shutdown(nodo_sock, 2);
	//restar_hilo();
	return res;
}
Example #17
0
int main(void) {

    //***************************************************************************************//
    //*****************ARRANCAMOS LA CONFIGURACION DEL PIC **********************************//
    //***************************************************************************************//
    Init_Hw();
    Delay1msT1(0); //Configuramos el puertos y quitamos analogicos
    Init_Pll();
    Delay1msT1(0); //configuramos el pll que abiasmos arracamos sin él
    Init_PWM();
    Delay1msT1(0); //configuramos el PWM
    init_interr_extern();
    Delay1msT1(0); //configuramos las interrupciones externas
    Init_Bluetooh();
    Delay1msT1(0); //Configuramos el serial-Bluetooth
    cargar_datos_ajuste();
    Init_I2C();
    Delay1msT1(0); //incializamos el I2c
    set_inicial();
    Delay1msT1(0); //Configuramos la incialicacion de sensor
    getAngle_init();
    Delay1msT1(0); //Incializamos el filtro kalman
    set_inicial();
    Delay1msT1(0); //Incializamos el acelerometro
    LED_ALL_ON();
    for (i = 0; i < 2500; i++) Delay_Nop(2000);
    LED_ALL_OFF();



    
   
    //***************************************************************************************//
    //***************************************************************************************//

    //*****************CALIBRAMOS EL ACELEROMETRO Y GIROSCOPO *******************************//
   // get_calibrado_acelerometro(5, 50); //cojemos los valres por defecto del  giroscopo y aceletometro
    LED_ALL_OFF();
    //***************************************************************************************//

    //*****************INICIALIZAMOS EL PID  Y LAS VARIABLES ********************************//

    //     pid_dsp_configuracion();

    //***************************************************************************************//
LED_ALL_OFF();

    //*****************ARRANCAMOS INTERRUPCION  DEL BUCLE PRINCIPAL *************************//

        SetupT3ForXmsPID(Tsample); //configuramos  la interrupcion principal
        SetupT4For20msPID(); //configuramos  la interrupcion principal
        StartInterrup4(); //incializamos la interrupcion

      StartInterrup3(); //incializamos la interrupcion


    enviar_mensaje("------------------------------------------------------");
    //***************************************************************************************//
    while (1) {

    }

}
Example #18
0
int main(int argc, char *argv[]) 
{
  int sock_tcp, new_fd;/* listen en sock_tcp, nuevas conexiones en new_tcp*/
  int socket_subs;
  FILE *fd;
  struct sockaddr_storage their_addr; // connector's address information
  socklen_t sin_size = sizeof their_addr;
  char s[INET6_ADDRSTRLEN];  
  char line[100];
  int n;
	Tema* aux = malloc(sizeof(Tema*));
	Msg* mensaje = malloc(sizeof(Msg*));
	Subscriptor *aus = malloc(sizeof(Subscriptor*));
	
	if (argc!=3) {
		fprintf(stderr, "Uso: %s puerto fichero_temas\n", argv[0]);
		return 1;
	}	
	sock_tcp = crear_socket_TCP(atoi(argv[1]));//Crear socket
	fd = fopen(argv[2],"r");			
	while (fgets(line, 100, fd) != NULL){// Incluír en la estructura de datos los temas	  
	  n = (int) strlen (line);
	  line[--n] = '\0';
	  insertar_tema(line);//Crear nuevo tema
  }
  insertar_tema("meta");//tema usado para subscriptores creados
  fclose(fd);
  if (listen(sock_tcp, BACKLOG) == -1) 
        exit(-1);
               
  while(1) {  // main accept() loop
    printf("\nSERVER: waiting for connections...\n");
    new_fd = accept(sock_tcp, (struct sockaddr *)&their_addr, &sin_size);
    if (new_fd == -1)
      perror("accept");
    inet_ntop(their_addr.ss_family, get_in_addr((struct sockaddr *)&their_addr),s, sizeof s);//direccion del llamante
    printf("server: got connection from %s\n", s);			
		mensaje = recv_msg(new_fd);// Recibir Msg de Editor o subscriptor    
		
		switch(mensaje->op){/* 0:Nuevo_subscriptor, 1:Crear Tema, 2:Eliminar tema, 3:Alta, 4:Baja, 5:Generar evento, 6:Eliminar subscriptor*/
			case 0:
			  printf("\nNUEVO SUBSCRIPTOR --------- \n");			
        if(!insertar_subs("meta", atoi(mensaje->valor),s)){
          enviar_mensaje(new_fd, "er");
          break;
        }
        enviar_mensaje(new_fd, "ok");
        // Enviar cada tema al subscriptor
        aux = inicio;
        while(aux!=NULL){
          if(strcmp(aux->nombre,"meta")!=0){
            socket_subs = abrir_conexion_tcp_con_servidor(atoi(mensaje->valor), s);
            send_msg(socket_subs, aux->nombre,"cebar",0);
            close(socket_subs);
          }
          aux = aux->next;          
        }
			  printf("NUEVO: FIN\n");
			break;
			case 1: /* Crear tema */
			  printf("\nCREAR: INICIO\n");
			  if(insertar_tema(mensaje->tema)){
			    enviar_mensaje(new_fd, "er");
          break;
			  }
        enviar_mensaje(new_fd, "ok");
				close(new_fd);
			  // 2. Avisar a todos los subscriptores 
			  aux = get_tema("meta");
			  if(aux==NULL){
			    break;
			  }			  
			  aus = aux->subs;			  
			  while(aus!=NULL){			    			
          socket_subs = abrir_conexion_tcp_con_servidor(aus->socket, aus->direccion);
          send_msg(socket_subs, mensaje->tema,"crear",0);
          if(!recibir_confirmacion(socket_subs))break;
	        close(socket_subs);	
	        aus = aus->next;        		    
			  }
			  printf("FIN CREAR\n");
			break;			
			case 2: /* Eliminar tema */
			printf("ELIMINAR: INICIO\n");
			  aux = get_tema(mensaje->tema);
			  if(aux == NULL){
			    enviar_mensaje(new_fd, "er");
          break;
			  }
			  enviar_mensaje(new_fd,"ok");
			  close(new_fd);
			  aus = aux->subs;
			  while(aus!=NULL){
			    socket_subs = abrir_conexion_tcp_con_servidor(aus->socket, aus->direccion);
          send_msg(socket_subs, mensaje->tema,"eliminar",0);  
          if(!recibir_confirmacion(socket_subs))break;      
	        close(socket_subs);	
	        aus = aus->next; 
			  }
			  eliminar_tema(mensaje->tema);		
      printf("ELIMINAR: FIN\n");
			break;
	    case 3: // Alta subs
			  printf("\nALTA: INICIO ----------- \n");
        if(!insertar_subs(mensaje->tema,atoi(mensaje->valor),s)){
          enviar_mensaje(new_fd, "er");
          break;
        }
        enviar_mensaje(new_fd,"ok");
				printf("ALTA: FIN ----------- \n");
			break;
	    case 4: // BAJA 
			  printf("\nBAJA: INICIO- --- ----\n");
			  if(!eliminar_subs(mensaje->tema,atoi(mensaje->valor))){
          enviar_mensaje(new_fd, "er");
          break;
        }
        enviar_mensaje(new_fd,"ok");
				printf("FIN: BAJA ---------------\n");
	    break;			
	    case 5: //Generar Evento
	      aux = get_tema(mensaje->tema);
	      if(aux==NULL){
	        enviar_mensaje(new_fd, "er");
          break;
	      }
	      enviar_mensaje(new_fd,"ok");
	      close(new_fd);
	      aus = aux->subs;
	      while(aus!=NULL){
	        socket_subs = abrir_conexion_tcp_con_servidor(aus->socket, aus->direccion);
          send_msg(socket_subs, mensaje->tema,mensaje->valor,0);          
	        close(socket_subs);	
	        aus = aus->next;
	      }				
		    printf("FIN EVENTO -------------\n");
		  break;		
	    case 6: //eliminar subscriptor
	      printf("\nELIMINAR SUBSCRIPTOR: INICIO -------\n");
		    aux = inicio;
		    while(aux!=NULL){
	        if(strcmp(aux->nombre,"meta") == 0){
		        if(!eliminar_subs(aux->nombre,atoi(mensaje->valor))){
			        enviar_mensaje(new_fd, "er");
              break;
			      }
			      enviar_mensaje(new_fd, "ok");
		      }else{
			      eliminar_subs(aux->nombre,atoi(mensaje->valor));
		      }		
		      aux = aux->next;	    
		    }
		    printf("ELIMINAR SUBSCRIPTOR: FIN\n");
		    break;
		}
      close(new_fd);  // parent doesn't need this
    }	
	return 0;
}
Example #19
0
void * LTS_demorado(void * var){
	char *buffer_2=(char *)malloc(1024);
	bzero(buffer_2,1024);
	char *prioridad=(char *)malloc(64);
	bzero(prioridad,64);
	char *paso_mensaje=(char *)malloc(256);

	while(1){
		sem_wait(sem_lts_demorado);
			pthread_t id_hilo=pthread_self();

			int retorno;
			int socket_demorado;
			proceso proceso;

			pthread_mutex_lock(&mutexListaDemorados);
			if((socket_demorado=sacar_conexion_demorada(listaConeccionesDemoradas))>0){
				pthread_mutex_unlock(&mutexListaDemorados);

				pthread_mutex_lock(&mutexVarMMP);
				pthread_mutex_unlock(&mutexVarMMP);
				if( (retorno = validar_mmp_demorado(socket_demorado)) == 0){
					enviar_mensaje("Enviame el codigo\n",socket_demorado);
					recibir_mensaje(&buffer_2,socket_demorado);
					recibir_mensaje(&prioridad,socket_demorado);
					//printf("Me llego la prioridad: %s\n",prioridad);
					proceso = crear_proceso(buffer_2,prioridad,socket_demorado);

					bzero(paso_mensaje,256);
					sprintf(paso_mensaje,"Se creo el proceso con PID=%d\n",proceso.pcb.pid);
					enviar_mensaje(paso_mensaje,socket_demorado);

					logx(proceso.pcb.pid,"LTS_demorado",id_hilo,"INFO","El proceso ha sido creado.");

					char *log_text=(char *)malloc(127);
					sprintf(log_text,"La prioridad del proceso es %d.",proceso.prioridad);
					logx(proceso.pcb.pid,"LTS_demorado",id_hilo,"DEBUG",log_text);
//					if ( buffer_2 != NULL ){
//						free(buffer_2);
//					}

					pthread_mutex_lock(&mutexListaNuevos);
					agregar_proceso(listaProcesosNuevos,proceso);
					pthread_mutex_unlock(&mutexListaNuevos);

					sem_post(sem_sts);

					logx(proceso.pcb.pid,"LTS_demorado",id_hilo,"LSCH","Agregue el proceso a la lista de Nuevos.");

					pthread_mutex_lock(&mutexVarMMP);
					mmp++;
					pthread_mutex_unlock(&mutexVarMMP);
					logx(proceso.pcb.pid,"LTS",id_hilo,"INFO","Se aumento el grado de multiprogramacion.");

				}else{

					 if( retorno == -2){
						logx(proceso.pcb.pid,"LTS",id_hilo,"ERROR","Se sobrepaso el maximo grado de multiprogramacion.");
						logx(proceso.pcb.pid,"LTS",id_hilo,"INFO","Se aumento el grado de multiprogramacion.");
					 }
				}

				//FD_CLR(socket_demorado,&(*master));
			}else{
				pthread_mutex_unlock(&mutexListaDemorados);
			}
			sleep(1);
	}

	return 0;
}
t_KER_PRO_CPU_UMV* manejo_conexiones(t_KER_PRO_CPU_UMV* msg){
	//	ACA SE MANEJAN LOS MENSAJES QUE PUEDEN LLEGAR
	if (msg != NULL) {
		//	SI NO ES NULO
		t_KER_PRO_CPU_UMV gen_msg = obtener_nueva_shared_str();
		memcpy(&gen_msg,msg,sizeof(t_KER_PRO_CPU_UMV));
		printf("el MENSAJE es de tipo: (%d) \n", gen_msg.gen_msg.id_MSJ);
		t_KER_PRO_CPU_UMV resp_msg = obtener_nueva_shared_str();

		switch(gen_msg.gen_msg.id_MSJ){

		case (HANDSHAKE_CPU_UMV):
			// SI ES UN HANDSHAKE
			puts("PRIMER MENSAJE RECIBIDO SE RESPONDE CON HANDSHAKE\n");
//			resp_msg->gen_msg.disconnected = 0;
			resp_msg.gen_msg.socket_descriptor = gen_msg.gen_msg.socket_descriptor;
			resp_msg.gen_msg.socket_descriptor_server = gen_msg.gen_msg.socket_descriptor_server;
			resp_msg.gen_msg.id_MSJ = HANDSHAKE_CPU_UMV;
			resp_msg.gen_msg.size_str = sizeof(t_KER_PRO_CPU_UMV);
			resp_msg.OK = 1;
			puts("ENVIO HANDSHAKE\n");
			// Se responde con el mismo handshake del tipo
			enviar_mensaje(resp_msg.gen_msg.socket_descriptor_server,resp_msg.gen_msg.id_MSJ,&resp_msg);
			puts("mensaje enviado respuesta handshake\n");
			break;

		case (SOLICITAR_BYTES):
			// SI RECIBE SOLICITUD DE DATOS
			puts("----------------------RECIBO SOLICITUD DE ENVIO DE DATOS----------------------\n");
			resp_msg.gen_msg.socket_descriptor = gen_msg.gen_msg.socket_descriptor;
			resp_msg.gen_msg.socket_descriptor_server = gen_msg.gen_msg.socket_descriptor_server;
			resp_msg.gen_msg.id_MSJ = SOLICITAR_BYTES;
			resp_msg.gen_msg.size_str = sizeof(t_KER_PRO_CPU_UMV);
			resp_msg.base_bytes = gen_msg.base_bytes;
			resp_msg.offset_bytes = gen_msg.offset_bytes;
			resp_msg.tamanio_bytes = gen_msg.tamanio_bytes;
			resp_msg.buffer = (char*)malloc(resp_msg.tamanio_bytes);
			resp_msg.OK = 1;
			printf("CPU solicita los datos [Base,Offset,Tamanio] : %i,%i,%i\n",resp_msg.base_bytes,resp_msg.offset_bytes,resp_msg.tamanio_bytes);
			memcpy(resp_msg.buffer,memoria+resp_msg.base_bytes+resp_msg.offset_bytes,resp_msg.tamanio_bytes);
			imprimirStream(resp_msg.buffer,resp_msg.tamanio_bytes);
//			printf("El buffer del pedido solicitado es: %s\n",resp_msg.buffer);
			enviar_mensaje(resp_msg.gen_msg.socket_descriptor_server,resp_msg.gen_msg.id_MSJ, &resp_msg);
			puts("-------------------- ENVIO DATOS SOLICITADOS ---------------------------------\n");
			break;

		case (CAMBIO_PROCESO_ACTIVO):
			// Recibo indicacion de programa activo
			printf("El id del programa activo es %i\n",gen_msg.PCB.id);
			resp_msg.gen_msg.socket_descriptor = gen_msg.gen_msg.socket_descriptor;
			resp_msg.gen_msg.socket_descriptor_server = gen_msg.gen_msg.socket_descriptor_server;
			resp_msg.gen_msg.id_MSJ = CAMBIO_PROCESO_ACTIVO;
			resp_msg.OK = 1;
			enviar_mensaje(resp_msg.gen_msg.socket_descriptor_server,resp_msg.gen_msg.id_MSJ, &resp_msg);
			break;

		case (ENVIAR_BYTES):
		// SI RECIBE SOLICITUD DE DATOS
			puts("----------------------RECIBO DATOS A SER GRABADOS----------------------\n");
			resp_msg.gen_msg.socket_descriptor = gen_msg.gen_msg.socket_descriptor;
			resp_msg.gen_msg.socket_descriptor_server = gen_msg.gen_msg.socket_descriptor_server;
			resp_msg.gen_msg.id_MSJ = ENVIAR_BYTES;
			resp_msg.gen_msg.size_str = sizeof(t_KER_PRO_CPU_UMV);
			resp_msg.base_bytes = gen_msg.base_bytes;
			resp_msg.offset_bytes = gen_msg.offset_bytes;
			resp_msg.tamanio_bytes = gen_msg.tamanio_bytes;
			resp_msg.OK = 1;
			printf("CPU graba los datos [Base,Offset,Tamanio] : %i,%i,%i\n",resp_msg.base_bytes,resp_msg.offset_bytes,resp_msg.tamanio_bytes);
			memcpy(memoria+resp_msg.base_bytes+resp_msg.offset_bytes,resp_msg.buffer,resp_msg.tamanio_bytes);
			imprimirStream(resp_msg.buffer,resp_msg.tamanio_bytes);
			enviar_mensaje(resp_msg.gen_msg.socket_descriptor_server,resp_msg.gen_msg.id_MSJ, &resp_msg);
			puts("-------------------- ENVIO CONFIRMACION DE GRABAR DATOS ---------------------------------\n");
			break;

		case (DESTRUIR_SEGMENTOS):
			puts("----------------------RECIBO AVISO DE DESTRUIR SEGMENTOS----------------------\n");
			resp_msg.gen_msg.socket_descriptor = gen_msg.gen_msg.socket_descriptor;
			resp_msg.gen_msg.socket_descriptor_server = gen_msg.gen_msg.socket_descriptor_server;
			resp_msg.gen_msg.id_MSJ = DESTRUIR_SEGMENTOS;
			resp_msg.gen_msg.size_str = sizeof(t_KER_PRO_CPU_UMV);
			resp_msg.OK = 1;
			enviar_mensaje(resp_msg.gen_msg.socket_descriptor_server,resp_msg.gen_msg.id_MSJ, &resp_msg);
			puts("------------- Segmentos destruidos----------------\n");
			break;

		default:
			printf("Recibi un mje default del tipo %i\n",gen_msg.gen_msg.id_MSJ);
			puts("NO ENTIENDO EL MENSAJE SOLICITADO\n");
			break;

		}
//		free(resp_msg);
	}
	puts("Fin primera recepcion");
	return NULL;
}