Esempio n. 1
0
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;
}
Esempio n. 2
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;
}