int main(int argc, char *argv[]) { int optn; /* use of getopt to determine whether to create random numbers for the disks or use the number specified and read disk values from a predeteremined file */ /*NOTE: options not implemented, functions exists just need to modify this main file if they are desired */ while((optn = getopt(argc,argv,"hfr")) != -1){ switch(optn){ case 'r': /* given an r option, set flag to true */ rand_flag = true; break; case 'f': /* given an f option, set file flag to true */ file_flag = true; break; case 'h': case '?': default: /* given an h, unknown, or default case, produce usage message */ usage(); return 1; } } /* initialize curr_mem */ curr_mem = 0; /**** set size_of_array from input, or else produce usage message and exit ****/ if(argv[1] != NULL){ size_of_array = atoi(argv[1]); } else{ usage(); return 1; } /* disk array used to represent disk board layout */ disk disks[size_of_array]; /* chceck memory usage */ curr_mem += sizeof(disks); check_mem_usage(); /* initialize disk array and set up the board layout */ memset(disks,0,(size_of_array * sizeof(disk))); disk_setup(size_of_array, disks); /* print large disk and small disk layout, as well as the initial state */ printf(" --- Large Disks --- \n"); int x; for(x = 0; x < size_of_array; x++){ printf("%d ",disks[x].lrg_val); } printf("\n\n"); printf(" --- Small Disks --- \n"); for(int x = 0; x < size_of_array; x++){ printf("%d ",disks[x].sml_val); } printf("\n \n \n"); printf("\n\n --- Initial State --- \n"); for(x= 0; x < size_of_array; x++){ printf("%d ",disks[x].sml_val); } printf("\n\n"); /* call function to emunlate simple memory-bounded A* algorithm on the disk board */ mem_bound_A(disks); /* clear memory in fringe before exit */ clear_fringe(); /* clear memory in clsoed list before exit */ clear_closed(); return 0; }
int socket_poll(void) { int r = 0; struct socket_message msg; memset(&msg, 0, sizeof(msg)); for (;;) { struct socket *sock; struct event *ev; if (S.check_ctrl) { if (_socket_has_ctrl()) { r = socket_handle_req(&msg); if (-1 != r) { clear_closed(msg.id, r); goto ret; } continue; } else { S.check_ctrl = 0; } } if (S.ev_idx == S.ev_n) { S.ev_n = event_wait(S.event_fd, S.ev, MAX_EVENT); S.check_ctrl = 1; S.ev_idx = 0; if (S.ev_n <= 0) { S.ev_n = 0; return -1; } } ev = &S.ev[S.ev_idx++]; sock = (struct socket *)ev->ud; if (!sock) { continue; } msg.id = sock->id; msg.ud = sock->ud; msg.data = 0; msg.size = 0; switch (sock->type) { case SOCKET_TYPE_OPENING: r = socket_try_open(sock, &msg); goto ret; case SOCKET_TYPE_LISTEN: r = socket_try_accept(sock, &msg); if (r == -1) break; goto ret; case SOCKET_TYPE_INVALID: break; default: if (ev->read) { if (sock->protocol == PROTOCOL_TCP) { r = socket_forward_tcp(sock, &msg); } else { r = socket_forward_udp(sock, &msg); if (r == SOCKET_UDP) { --S.ev_idx; goto ret; } } if (ev->write) { ev->read = 0; --S.ev_idx; } if (r == -1) break; clear_closed(sock->id, r); goto ret; } if (ev->write) { r = socket_send_buffer(sock, &msg); if (r == -1) break; clear_closed(sock->id, r); goto ret; } break; } } ret: msg.type = r; S.dispatch(&msg); return r; }