Ejemplo n.º 1
0
void* report_events_master(void* shared_void){
	SharedVars* shared = (SharedVars*)shared_void;

	while (1){
		usleep(0.1*SEC_TO_USEC);
		if (shared->orders_new[0]){
			char send_msg[BUFF_SIZE];
			send_msg[0] = NEW_ORDER;
			for (int button = 0; button < N_FLOORS * 2; button++){
				if (!shared->netw_master_q[button] && shared->orders_new[button + 1]){
					send_msg[1] = button;
					uint8_t cheapest_slave = cost_fun(shared, button);
					shared->netw_membs[cheapest_slave].send(send_msg);
					//get ack
					shared->netw_master_q[button] = cheapest_slave;
				}
			}
			memset(shared->orders_new, 0, 1 + N_FLOORS * 2);
		}

		if (shared->orders_complete){
			for (int button = 0; button < N_FLOORS * 2; button++){
				if (shared->netw_master_q[button] && shared->orders_complete[button + 1]){
					shared->netw_master_q[button] = 0;
					//ack
				}
			}
			memset(shared->orders_new, 0, 1 + N_FLOORS * 2);
		}
	}
}
Ejemplo n.º 2
0
void* handle_local_events_master(){
	while (1){
		usleep(0.1*SEC_TO_USEC);
		
		if (shared->elev_q->orders_new[0]){
			for (int button = 0; button < N_FLOORS * 2; ++button){
				if (!shared->netw_master_q[button] && shared->elev_q->orders_new[button + 1]){
					char send_msg[BUFF_SIZE];
					send_msg[0] = NEW_ORDER;			
					send_msg[1] = button;
					
					uint8_t cheapest_slave = cost_fun(shared, button);
					if(shared->netw_membs[cheapest_slave].send_and_get_ack(send_msg)){
						shared->netw_master_q[button] = cheapest_slave;
					}
				}
			}
			memset(shared->elev_q->orders_new, 0, 1 + N_FLOORS * 2);
		}

		if (shared->elev_q->orders_complete){
			for (int button = 0; button < N_FLOORS * 2; button++){			
				if (shared->netw_master_q[button] && shared->orders_complete[button + 1]){
					shared->netw_master_q[button] = 0;
				}
			}
			memset(shared->elev_q->orders_complete, 0, 1 + N_FLOORS * 2);
		}
	}
}
Ejemplo n.º 3
0
void* manage_slave(void* slave_id_void_ptr){
	int slave_id = (int)(*slave_id_void_ptr);

	int lives = 4;
	clock_t prev_heartbeat = clock();
	while (1){
		struct timeval timeout;
		timeout.tv_sec = 0;
		timeout.tv_usec = 0.2*SEC_TO_USEC;
		
		struct RecvMsg recv_msg;
		fd_set read_fd_set;
		file_descriptor_setup(&shared->netw_membs[slave_id].sock_fd, &read_fd_set);
		if (select(shared->netw_membs[slave_id].sock_fd + 1, &read_fd_set, NULL, NULL, &timeout) > 0)
			recv_msg = shared->netw_membs[slave_id].recv();
		else
			recv_msg.MSG_ID = NO_RESPONSE;

		switch (recv_msg.MSG_ID){
		case HEARTBEAT:
			shared->netw_membs[slave_id].floor 			= recv_msg.content[1];
			shared->netw_membs[slave_id].dir 			= recv_msg.content[2];
			shared->netw_membs[slave_id].elev_fsm_state = recv_msg.content[3];
			lives = 4;
			prev_heartbeat = clock();
			break;

		case NEW_ORDER:
			for (int button = 0; button < N_FLOORS * 2; button++){
				if (!shared->netw_master_q[button] && recv_msg.content[1 + button]){
					
					uint8_t cheapest_slave = cost_fun(button);
					if (cheapest_slave == MY_ID){
						shared->elev_q->add_order_from_netw(button);
						shared->netw_master_q[button] = 255;
					}
					else{
						char send_msg[BUFF_SIZE];
						send_msg[0] = NEW_ORDER;
						send_msg[1] = button;
						if(shared->netw_membs[cheapest_slave].send_and_get_ack(send_msg)){
							shared->netw_master_q[button] = cheapest_slave;
						}
					}
				}
			}
			break;

		case COMPLETED_ORDER:
			for (int button = 0; button < N_FLOORS * 2; ++button){
				if (shared->netw_master_q[button] && recv_msg.content[button + 1]){
					shared->netw_master_q[button] = 0;
					
					char send_msg[BUFF_SIZE];
					send_msg[0] = ACKNOWLEDGE;
					shared->netw_membs[slave_id].send(send_msg);
				}
			}
			break;

		case NO_RESPONSE:
			if ((clock() - prev_heartbeat) / CLOCKS_PER_SEC > 0.5){
				lives--;
				if (!lives){
					for (int button = 0; button < N_FLOORS * 2; ++button){
						if (shared->netw_master_q[button] == slave_id){
							shared->elev_q->recycle_order(button);
						}
					}
					if (shared->backup == slave_id){
						shared->backup = NO_BACKUP;
					}
					close(shared->netw_membs[slave_id].sock_fd);
					shared->netw_membs[slave_id] = NetwMemb();
					delete slave_id;
					pthread_exit(NULL);
				}
			}
			break;
		}
	}
}
Ejemplo n.º 4
0
		virtual int t(int n)const{return cost_fun(n);}
Ejemplo n.º 5
0
		virtual void t0()const{ cost_fun(10);}
Ejemplo n.º 6
0
		void t0()const{ cost_fun(10);}
Ejemplo n.º 7
0
int cost_fun(int n)
{
	if (n<1) return 1;
	return cost_fun(n-1) + cost_fun(n-2);
}
Ejemplo n.º 8
0
void* handle_orders(void* shared_void){										//HELP PLZ!
	SharedVars* shared = (SharedVars*)shared_void;							//Fokin' names!
	int slave_id = shared->slave_id;										//... / Release semaphore here

	int lives = 4;
	clock_t prev_heartbeat = clock();
	while (1){
		struct timeval timeout;
		timeout.tv_sec = 0;
		timeout.tv_usec = 0.4*SEC_TO_USEC;
		fd_set read_fd_set = file_descriptor_setup(&shared->netw_membs[slave_id].sock_fd, 1);

		RecvMsg recv_msg;
		if (select(shared->netw_membs[slave_id].sock_fd + 1, &read_fd_set, NULL, NULL, &timeout) > 0)
			recv_msg = shared->netw_membs[slave_id].recv();
		else
			recv_msg.MSG_ID = NO_RESPONSE;

		switch (recv_msg.MSG_ID){
		case HEARTBEAT:
			shared->netw_membs[slave_id].floor = recv_msg.content[1];
			shared->netw_membs[slave_id].dir = recv_msg.content[2];
			shared->netw_membs[slave_id].elev_fsm_state = recv_msg.content[3];
			lives = 4;
			prev_heartbeat = clock();
			break;

		case NEW_ORDER:
			char send_msg[BUFF_SIZE];
			send_msg[0] = NEW_ORDER;
			for (int button = 0; button < N_FLOORS * 2; button++){
				if (!shared->netw_master_q[button] && recv_msg.content[button + 1]){
					send_msg[1] = button;
					uint8_t cheapest_slave = cost_fun(shared, button);
					if (cheapest_slave == MY_ID){
						shared->local_q[button] = 1;
						shared->netw_master_q[button] = 255;
					}
					else{
						shared->netw_membs[cheapest_slave].send(send_msg);
						//get ack
						shared->netw_master_q[button] = cheapest_slave;
					}
				}
			}
			break;

		case COMPLETED_ORDER:
			for (int button = 0; button < N_FLOORS * 2; button++){
				if (shared->netw_master_q[button] && recv_msg.content[button + 1]){
					shared->netw_master_q[button] = 0;
					//ack
				}
			}
			break;

		case NO_RESPONSE:
			if ((clock() - prev_heartbeat) / CLOCKS_PER_SEC > 0.5){
				lives--;
				if (!lives){
					for (int button = 0; button < N_FLOORS * 2; button++){
						if (shared->netw_master_q[button] == slave_id){
							//Place order in local_q / make it re-enter the network as a new order
							shared->orders_new[button + 1] = 1;
							shared->orders_new[0] = NEW_ORDER;
						}
					}
					if (shared->backup == slave_id){
						shared->backup = NO_BACKUP;
					}

					close(shared->netw_membs[slave_id].sock_fd);
					shared->netw_membs[slave_id] = NetwMemb();
					pthread_exit(NULL);										// Might need arg for return value
				}
			}
			break;
		}
	}
}