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); } } }
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); } } }
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; } } }
virtual int t(int n)const{return cost_fun(n);}
virtual void t0()const{ cost_fun(10);}
void t0()const{ cost_fun(10);}
int cost_fun(int n) { if (n<1) return 1; return cost_fun(n-1) + cost_fun(n-2); }
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; } } }