示例#1
0
int main(int argc, char *argv[]){
	// Call handle shutdown if "Ctrl+C" is hit
	if (catch_signal(SIGINT, handle_shutdown) == -1)
		error("Can’t set the interrupt handler");
	listener_d = open_listener_socket();
	
	// Create a socket
	bind_to_port(listener_d, 30000);
	
	// Set the listen queue lenght to 10
	if (listen(listener_d, 10) == -1)
		error("Can’t listen");
	struct sockaddr_storage client_addr;
	unsigned int address_size = sizeof(client_addr);
	puts("Waiting for connection");
	char buf[255];
	
	while (1) {
		// Listen for a connection
		int connect_d = accept(listener_d, (struct sockaddr *)&client_addr, &address_size);
		if (connect_d == -1)
			error("Can’t open secondary socket");
			
			
		if(!fork()){
			close(listen_d);
			
			// Send data to the client
			if (say(connect_d, "Internet Knock-Knock Protocol Server\r\nVersion 1.0\r\nKnock! Knock!\r\n>") != -1) {
				read_in(connect_d, buf, sizeof(buf));
				
				
				// Check the clients answers
				if (strncasecmp("Who's there?", buf, 12))
					say(connect_d, "You should say 'Who's there?'!");
				else {
					if (say(connect_d, "Oscar\r\n> ") != -1) {
						read_in(connect_d, buf, sizeof(buf));
						if (strncasecmp("Oscar who?", buf, 10))
							say(connect_d, "You should say 'Oscar who?'!\r\n");
						else
							say(connect_d, "Oscar silly question, you get a silly answer\r\n");
					}
				}
			}
			
			close(connect_d);
			exit(0);
		}
		// close secondary socket.
		close(connect_d);
	}
	return 0;
}
int parse_path (struct connection *c) {
  int sz;
  if (read_in (c->Tmp, &sz, sizeof (sz)) != sizeof (sz)) {
    return -1;
  }
  if (read_in (c->Tmp, value_buff, sz) != sz) {
    return -2;
  }
  value_buff[sz] = 0;
  return 0;
}
示例#3
0
int main(int argc, char *argv[])
{
    int connect_d = 0, rc = 0;
    char intro_msg[] = "Internet Knock-Knock Protocol Server\nKnock, knock.\n";
    
    if (catch_signal(SIGINT, handle_shutdown) == -1)
	error("Setting interrupt handler");
  
    int port = 30000;
    listener_d = open_listener_socket();
    bind_to_port(listener_d, port);
    
    if (listen(listener_d, 10) == -1)
	error("Can't listen");

    printf("Waiting for connection on port %d\n", port);

    char buf[255];

    while (1) {
	connect_d = open_client_socket();

	if (say(connect_d, intro_msg) == -1) {
	    close(connect_d);
	    continue;
	}

	read_in(connect_d, buf, sizeof(buf));
	// check to make sure they said "Who's there?"
	
	if (say(connect_d, "Surrealist giraffe.\n") == -1) {
	    close(connect_d);
	    continue;
	}

	read_in(connect_d, buf, sizeof(buf));
	// check to make sure they said "Surrealist giraffe who?"

 
	if (say(connect_d, "Bathtub full of brightly-colored machine tools.\n") == -1) {
	    close(connect_d);
	    continue;
	}

	close(connect_d);
    }
    return 0;
}
示例#4
0
TEST(Parser, ParseMpzClass)
{
  std::stringstream read_in("-12412312");
  mpz_class val;
  EXPECT_TRUE(parse_mpz_class(read_in, val));
  EXPECT_EQ(-12412312_mpz, val);
}
示例#5
0
static int rpcc_process_handshake_packet (struct connection *c) {
  struct rpcc_data *D = RPCC_DATA(c);
  static struct rpc_handshake_packet P;
  if (D->packet_num != -1 || D->packet_type != RPC_HANDSHAKE) {
    return -2;
  }
  if (D->packet_len != sizeof (struct rpc_handshake_packet)) {
    rpcc_send_handshake_error_packet (c, -3);
    return -3;
  }
  assert (read_in (&c->In, &P, D->packet_len) == D->packet_len);
  if (!matches_pid (&P.sender_pid, &D->remote_pid)) {
    rpcc_send_handshake_error_packet (c, -6);
    return -6;
  }
  if (!P.sender_pid.ip) {
    P.sender_pid.ip = D->remote_pid.ip;
  }
  memcpy (&D->remote_pid, &P.sender_pid, sizeof (struct process_id));
  if (!matches_pid (&PID, &P.peer_pid)) {
    rpcc_send_handshake_error_packet (c, -4);
    return -4;
  }
  return 0;
}
示例#6
0
int
main(int argc, char **argv)
{
	size_t i;
	if(argc != 1) {
		usage(stderr);
		return 0;
	}
	
	/* read in */
	ldns_rr_list *list = ldns_rr_list_new();
	ldns_rdf *qname = 0;
	read_in(list, &qname, stdin);

	/* check covers */
	covertests(list, qname);
	for(i=0; i<ldns_rr_list_rr_count(list); ++i)
	{
		ldns_rr* rr = ldns_rr_list_rr(list, i);
		if(!ldns_dname_is_subdomain(qname, ldns_rr_owner(rr))) {
			covertests(list, ldns_rr_owner(rr));
		}
	}

	ldns_rr_list_deep_free(list);
	return 0;
}
示例#7
0
TEST(Parser, ParseMpqClass)
{
  {
    std::stringstream read_in("-45/90");
    mpq_class val;
    EXPECT_TRUE(parse_mpq_class(read_in, val));
    EXPECT_EQ(-1/2_mpq, val);
  }

  {
    std::stringstream read_in("67");
    mpq_class val;
    EXPECT_TRUE(parse_mpq_class(read_in, val));
    EXPECT_EQ(67_mpq, val);
  }
}
int main (int argc,char **argv)
{
  extern char *inputfile,*initfile,*outputfile;
  int input_array_int[10];
  double input_array[10];

  int error;
 
  error=MPI_Init (&argc, &argv);  //MPI INITIALIZE
  com=MPI_COMM_WORLD;
   
  if(error!=MPI_SUCCESS){
    printf("MPI could not be initialized.\n");
    exit(1);
  }

  MPI_Comm_size (com, &size);
  MPI_Comm_rank (com, &rank);

  if(argc != 4) usage();     //VERIFICATION OF INPUT FILES

  if (rank == 0)
    {
      initfile=argv[1];      //ASIGNATION
      inputfile=argv[2];     //OF FILE'S 
      outputfile=argv[3];    //NAMES
      
      create_remove_dir();   //REMOVE OLD outputfile AND CREATE A NEW ONE

      read_in(input_array_int,input_array);         //READ INITIAL CONDITIONS
    }

  MPI_Bcast(input_array_int, 2 , MPI_INT, 0 , com);  
  MPI_Bcast(input_array, 6 , MPI_DOUBLE, 0 , com);  

  Num_par = input_array_int[0];      //NUMBER OF PARTICLES IN THE SIMULATION
  INTEGRATOR = input_array_int[1];   //INTEGRATOR ELECTION
  
  t = input_array[0];                //TIMESTEP
  G = input_array[1];                //GRAVITATION CONSTANT
  w = input_array[2];                //STAR'S ROTATION 
  Num_archive   = input_array[3];    //NUMBER OUTPUT ARCHIVES
  Num_simulation= input_array[4];    //NUMBER OF INTEGRATION FOR ARCHIVE
  EPS = input_array[5];              //SOFTENING
  
  allocate_memory();                 //ALLOCATE THE MEMORY
  
  if (rank == 0) read_input();       //READ INITIAL POSITIONS AND VELOCITIES 

  Bcast_part_struct(0);  //MASTER MAKE A BROADCAST OF INITIAL POSITIONS AND VELOCITIES

  emulator();            //SIMULATION 

  free_memory();         //FREE THE MEMORY

  error=MPI_Finalize();  //END OF MPI

  return error;
}
示例#9
0
TEST(Parser, ParseMatrix)
{
  std::stringstream read_in("2 3 1 2/5 3 -4 5 -6/2");
  MatrixQ result;
  EXPECT_TRUE(parse_matrix(read_in, result));
  MatrixQ expected = {{1_mpq, 2/5_mpq, 3_mpq}, {-4_mpq, 5_mpq, -6/2_mpq}};
  EXPECT_EQ(expected, result);
}
示例#10
0
TEST(Parser, EatWhitespace)
{
  std::stringstream read_in("  \r\n\t  abc");
  eat_whitespace(read_in);
  std::string abc;
  read_in >> abc;
  EXPECT_EQ("abc", abc);
}
示例#11
0
static inline void safe_read_in (netbuffer_t *H, char *data, int len) {
  assert (read_in (H, data, len) == len);
  int i;
  for (i = 0; i < len; i++) {
    if (data[i] == 0) {
      data[i] = ' ';
    }
  }
}
示例#12
0
/* 主函数 */
int main(int argc, char *argv[])
{
    if (catch_signal(SIGINT, handle_shutdown) == -1)
        error("Can't set the interrupt handler");// 如果有人按了Ctrl-C就调用handle_shutdown()。

    listener_d = open_listener_socket();// 创建套接字。
    bind_to_port(listener_d, 30000);
    if (listen(listener_d, 10) == -1) {// 把监听长度设为10。
        error("listen error: ");
    }
    struct sockaddr_storage client_addr;
    unsigned int address_size = sizeof(client_addr);
    puts("Waiting for connection");
    char buf[255];

    while (1) {// 需要循环“接受连接,然后开始对话”。
        int connect_d = accept(listener_d, (struct sockaddr *)&client_addr, &address_size);// 接受来自客户端的连接。
        if (connect_d == -1) {
            error("connect error:");
        }

        if (!fork()) {// 创建子进程,如果fork()调用返回0,就说明你在子进程中。
            close(listener_d);// 在子进程中,需要关闭主监听套接字。子进程只用connect_d套接字和客户端通信。
            if (say(connect_d, "Internet Knock-Knock Server \r\nVersion 1.0\r\nKnock! Knock!\r\n>") != -1){
                read_in(connect_d, buf, sizeof(buf));
                if (strncasecmp("Who's there?", buf, 12))
                    say(connect_d, "You should say 'Who's there?' !");
                else {
                    if (say(connect_d, "Oscar\r\n>") != -1) {
                        read_in(connect_d, buf, sizeof(buf));
                        if (strncasecmp("Oscar who?", buf, 10))
                            say(connect_d, "You should say 'Oscar who?' !\r\n");
                        else
                            say(connect_d, "Oscar silly question, you set a silly answer\r\n");
                    }
                }
            }
            close(connect_d);// 一旦通信结束,子进程就可以关闭通信套接字了。
            exit(0);// 通信结束以后,子进程应该退出程序。这样就能防止子进程进入服务器的主循环。
        }
        close(connect_d);
    }
    return 0;
}
示例#13
0
/*
 ***************************************************************************
 * Read voltage input statistics.
 *
 * IN:
 * @a  Activity structure.
 *
 * OUT:
 * @a  Activity structure with statistics.
 ***************************************************************************
 */
__read_funct_t wrap_read_in(struct activity *a)
{
	struct stats_pwr_in *st_pwr_in
		= (struct stats_pwr_in *) a->_buf0;

	/* Read voltage input stats */
	read_in(st_pwr_in, a->nr);

	return;
}
示例#14
0
/*
 * Grab stage1 from the specified device file descriptor.
 */
static int
read_stage1_from_disk(int dev_fd, char *stage1_buf)
{
	assert(stage1_buf != NULL);

	if (read_in(dev_fd, stage1_buf, SECTOR_SIZE, 0) != BC_SUCCESS) {
		perror(gettext("Unable to read stage1 from disk"));
		return (BC_ERROR);
	}
	return (BC_SUCCESS);
}
示例#15
0
文件: server.c 项目: ooonak/cmess
int main(int argc, char *argv[])
{
  if(catch_signal(SIGINT, handle_shutdown) == -1)
    error("Can't set the interrupt handler.");
  listener_d = open_listener_socket();
  bind_to_port(listener_d, 30000);
  if(listen(listener_d, 10) == -1)
    error("Can't listen.");
  struct sockaddr_storage client_addr;
  unsigned int address_size = sizeof(client_addr);
  puts("Waiting for connection.");
  char buf[255];
  
  // This version of the server forks a new seperate child process to each client.
  while(1) {
    int connect_d = accept(listener_d, (struct sockaddr*) &client_addr, &address_size);
    if(connect_d == -1)
      error("Can't open secondary socket.");

    if(!fork()) {
      close(listener_d);
      if(say(connect_d,
            "Temperature sensor ready\r\n") != -1) {
        read_in(connect_d, buf, sizeof(buf));
        logger(buf);
        if(strncasecmp("READDATA", buf, 8)) {
        }
        else {
          say(connect_d, "1: temp data in JSON format\r\n");
          say(connect_d, "2: temp data in JSON format\r\n");
          say(connect_d, "3: temp data in JSON format\r\n");
        }
        

        /*  
        else {
          if(say(connect_d, "Oscar\r\n> ") != -1) {
            read_in(connect_d, buf, sizeof(buf));
            if(strncasecmp("Oscar who?", buf, 10))
              say(connect_d, "You should say 'Oscar who?'!\r\n");
            else
              say(connect_d, "Oscar silly question, you get a silly answer.\r\n");
          }
        }
        */

      }
    close(connect_d);
    exit(0);
    }
    close(connect_d);
  }
  return 0;
}
示例#16
0
static int rpcc_process_nonce_packet (struct connection *c) {
  struct rpcc_data *D = RPCC_DATA(c);
  static struct rpc_nonce_packet P;
  int res;

  if (D->packet_num != -2 || D->packet_type != RPC_NONCE) {
    return -2;
  }
  if (D->packet_len != sizeof (struct rpc_nonce_packet)) {
    return -3;
  }
  assert (read_in (&c->In, &P, D->packet_len) == D->packet_len);

  vkprintf (2, "Processing nonce packet, crypto schema: %d, key select: %d\n", P.crypto_schema, P.key_select);

  switch (P.crypto_schema) {
  case RPC_CRYPTO_NONE:
    if (P.key_select) {
      return -3;
    }
    if (D->crypto_flags & 1) {
      #ifdef AES
      if (D->crypto_flags & 2) {
        release_all_unprocessed (&c->Out);
      }
      #endif
      D->crypto_flags = 1;
    } else {
      return -5;
    }
    break;
#ifdef AES
  case RPC_CRYPTO_AES:
    if (!P.key_select || P.key_select != get_crypto_key_id ()) {
      return -3;
    }
    if (!(D->crypto_flags & 2)) {
      return -5;
    }
    if (abs (P.crypto_ts - D->nonce_time) > 30) {
      return -6;	//less'om
    }
    res = RPCC_FUNC(c)->rpc_start_crypto (c, P.crypto_nonce, P.key_select);
    if (res < 0) {
      return -6;
    }
    break;
#endif
  default:
    return -4;
  }
  vkprintf (2, "Processed nonce packet, crypto flags = %d\n", D->crypto_flags);
  return 0;
}
示例#17
0
int main()
{
  char string[101];

  printf("Enter upto 100 characters:\n");
  read_in(string, 100);
  printf("Before: %s\n", string);
  rm_vowels(string);
  printf(" After: %s\n", string);

  return 0;
}
示例#18
0
int main(int argc, char* argv[])
{
  if (signal(SIGINT, handle_shutdown) == SIG_ERR)      /*  SIGINT = ctrl-c = intr    */
    error("Can't set the interrupt handler");
  listener_d = open_listener_socket();
  bind_to_port(listener_d, 30000);
  if (listen(listener_d, 10) == -1)     /* 监听连接   */
    error("Can't listen");
  struct sockaddr_storage client_addr;
  unsigned int address_size = sizeof client_addr;
  puts("Waiting for connection");
  char buf[255];
  for(;;) {
    int connect_d = accept(listener_d, (struct sockaddr *)&client_addr,
                           &address_size);
    if (connect_d == -1)
      error("Can't open secondary socket");
    if ( !fork()) {     /* 这里会检查连接时的进程号,如果返回值为0则表示该进程是子进程需要在操作,否者跳过    */
      if (say(connect_d, "Internet Knock-Knock Protocol Server\r\nVersion 1.0\r\nKnock! Knock!\r\n> ") != -1) {     /* 向客户端发送数据  */
        /*  上面这行就决定你一开是会看到什么 */
        read_in(connect_d, buf, sizeof(buf));
        if (strncasecmp("Who's there?", buf, 12))    /* 比较 buf 变量的值是否为 who's there?    这里就决定你输入什么才是正确的  */
          say(connect_d, "You should say 'Who's there?'!");
        else {
          if (say(connect_d, "Oscar\r\n> ") != -1) {
            read_in(connect_d, buf, sizeof(buf));
            if (strncasecmp("Oscar who?", buf, 10))
              say(connect_d, "You should say 'Oscar who?'!\r\n");
            else
              say(connect_d, "Oscar silly question, you get a silly answer\r\n");
          }
        }
      }
      close(connect_d);
      exit(0);
    }
    close(connect_d);
  }
  return 0;
}
示例#19
0
int memcache_store (struct connection *c, int op, const char *key, int key_len, int flags, int delay, int size) {
    int user_id, cat = 0, friend_id = 0, i;
    privacy_key_t privacy_key = 0;

    if (verbosity > 0) {
        fprintf (stderr, "mc_store: op=%d, key=\"%s\", flags=%d, delay=%d, bytes=%d\n", op, key, flags, delay, size);
    }

    if (binlog_disabled == 2) {
        return -2;
    }

    if (reverse_friends_mode) {
        if (op == mct_set && key_len >= 8 && !strncmp (key, "userlist", 8)) {
            return exec_store_userlist (c, key, key_len, size);
        }
        return 0;
    }

    if (op == mct_set && sscanf (key, "friends%d_%d", &user_id, &cat) == 2 && user_id > 0 && cat > 0 && cat < 32) {
        int s = parse_list (R, MAX_RES, &c->In, size);
        int res = 0;
        if (s >= 0) {
            res = do_set_category_friend_list (user_id, cat, R, s);
        }
        if (verbosity > 0) {
            fprintf (stderr, "set friend cat list: size = %d, res = %d\n", s, res);
        }
        return res;
    }

    if (size > 1024) {
        return -2;
    }

    assert (read_in (&c->In, stats_buff, size) == size);
    stats_buff[size] = 0;

    if (sscanf (key, "friendreq%d_%d", &user_id, &friend_id) == 2 && user_id > 0 && friend_id > 0) {
        return do_add_friend_request (user_id, friend_id, atol(stats_buff), (op == mct_add) * 2 + (op == mct_set)) >= 0;
    }

    if (op != mct_add && sscanf (key, "friend%d_%d", &user_id, &friend_id) == 2 && user_id > 0 && friend_id > 0) {
        return do_add_friend (user_id, friend_id, atol(stats_buff), 0, op == mct_set);
    }

    if (op != mct_add && sscanf (key, "privacy%d_%n", &user_id, &i) >= 1 && user_id > 0 && parse_privacy_key (key+i, &privacy_key, 1) > 0) {
        return do_set_privacy (user_id, privacy_key, stats_buff, size, op == mct_set);
    }

    return 0;
}
示例#20
0
int get_saved_userlist (struct connection *c, int list_id) {
    if (!c->Tmp) {
        return -1;
    }
    struct keep_mc_header *D = (struct keep_mc_header *) c->Tmp->start;
    advance_read_ptr (c->Tmp, sizeof (struct keep_mc_header));
    int res = D->num;
    assert (read_in (c->Tmp, userlist, res * 4) == 4 * res);
    if (D->list_id != list_id) {
        return -1;
    }
    return res;
}
示例#21
0
void list_implementation()//list implementation
{
	list<Question> all_problems;
	list<Question> problems;
	list<Question>::iterator l_itr;
	vector<Question> temp;
	int correct_count = 0;
	ifstream myfile;
	myfile.open ("Testfile.txt");
	Question read_in("Temp", 1, "answ1", "answ2","answ3");
	for(int i=0;i<15;++i)//reads in to list
	{
		myfile>>read_in;
		all_problems.push_back(read_in);
	}
	for(l_itr=all_problems.begin(); l_itr != all_problems.end();++l_itr)//converts to vector to shuffle
	{
		temp.push_back(*l_itr);
	}
	srand(time(0));//ensures truly random shuffle by seeding system time 
	random_shuffle(temp.begin(),temp.end());//shuffles temp vector
	for(int i=0;i<10;++i)//reads into new list
	{
		problems.push_back(temp[i]);
	}
	cout<<"Loop here\n";
	for(l_itr=problems.begin(); l_itr != problems.end() ;++l_itr)//asks question + gets answers
	{
		bool correct = false;
		int answer = 0;
		string input;
		cout<<*l_itr;
		cin>>input;
		if(!is_number(input) || StringToNumber(input)<0 || StringToNumber(input)>5)
			throw runtime_error("Bad answer input");
		else
			answer = StringToNumber(input);
		if(answer == l_itr->correct_answer_num())
		{
			++correct_count;
			cout<<"Awesome work! onto the next question\n";
		}
		else
			cout<<"Aw too bad you missed that one, try another!\n";
	}
	if(correct_count>6)
		cout<<"You got "<<correct_count<<" Right, and passed Nice job!\n";
	else
		cout<<"You got "<<correct_count<<" Right, and failed, better luck next time\n";
	return;
}
示例#22
0
文件: main.c 项目: moutend/HeadFirstC
int main (int argc, char *argv[]) {
  if (catch_signal (SIGINT, handle_shutdown) == -1)
    error ("割り込みハンドラを設定できません。");
  listener_d = open_listener_socket ();
  bind_to_port (listener_d, 30000);
  if (listen (listener_d, 10) == -1)
    error ("接続待できません。");
  struct sockaddr_storage client_addr;
  unsigned int address_size = sizeof (client_addr);
  puts ("接続を待っています。");
  char buf[256];
  while (1) {
    int connect_d = accept (listener_d, (struct sockaddr*)&client_addr, &address_size);
    if (connect_d == -1)
      error ("第2のソケットを開けません。");
    if (!fork()) {
      close (!fork());
      if (say (connect_d, "インターネット ノックノックプロトコル\r\nバージョン1.0\r\n") != -1) {
        read_in (connect_d, buf, sizeof (buf));
        if (strncasecmp ("Who's there?", buf, 12))
          say (connect_d, "「Who's there?」と入力しなければいけません。");
        else {
          if (say (connect_d, "Oscar\r\n") != -1) {
            read_in (connect_d, buf, sizeof (buf));
            if (strncasecmp ("Oscar who?", buf, 10))
              say (connect_d, "「Who's there?」と入力しなければいけません。");
            else
              say (connect_d, "Oscar silly question, you'll get silly answer.");
          }
        }
      }
      close (connect_d);
      exit (0);
    }
    close (connect_d);
  }
  return 0;
}
示例#23
0
int main(int argc, char **argv) {
	int i = 0, j = 0, k = 0;

	alloc_puzzle();
	read_in();
	printf("\n\nPuzzle as read in:\n");
	print_puzzle();
	alloc_cand();

	while (!solved()) {
		if (i == 2) {
			printf("\nno luck after 20 iterations...\nis the puzzle solvable?\nexiting...\n");
			free_mem();
			exit(EXIT_SUCCESS);
		}
		i++;
		cand();
		printf("\nPuzzle after iteration #%d\n", i);
		print_puzzle();
		/*
		if (i == 50) {
			printf("num candidates\n");
			for (j = 0; j < N; j++) 
				for (k = 0; k < N; k++) 
					printf("%d_%d: %d\n", j, k, puz_can[j][k][0]);
		}
		*/
		reset();
	}

	/*
	cand();
	printf("\nPuzzle after one candidacy:\n");
	print_puzzle();
	reset();
	cand();
	printf("\nPuzzle after two candidacies:\n");
	print_puzzle();
	reset();
	cand();
	printf("\nPuzzle after three candidacies:\n");
	print_puzzle();
	*/

	return EXIT_SUCCESS;
}
示例#24
0
int rpcc_default_execute (struct connection *c, int op, int len) {
  vkprintf (1, "rpcc_execute: fd=%d, op=%d, len=%d\n", c->fd, op, len);
  if (op == RPC_PING && len == 24) {
    c->last_response_time = precise_now;
    static int Q[12];
    assert (read_in (&c->In, Q, 24) == 24);
    static int P[12];
    P[0] = 24;
    P[1] = RPCC_DATA(c)->out_packet_num++;
    P[2] = RPC_PONG;    
    P[3] = Q[3];
    P[4] = Q[4];
    P[5] = compute_crc32 (P, 20);
    vkprintf (1, "Received ping from fd=%d. ping_id = %lld. Sending pong\n", c->fd, *(long long *)(Q + 3));
    write_out (&c->Out, P, 24);
    RPCC_FUNC(c)->flush_packet(c);
    return 24;
  }
  return SKIP_ALL_BYTES;
}
int rpcs_execute (struct connection *c, int op, int len) {
  vkprintf (3, "rpcs_execute: fd=%d, op=%x, len=%d\n", c->fd, op, len);

  if (len > MAX_PACKET_LEN) {
    return SKIP_ALL_BYTES;
  }

  assert (read_in (&c->In, &P, len) == len);
  len -= 16;
  switch (op) {
    case COPYEXEC_RPC_TYPE_HANDSHAKE:
      return rpc_execute_handshake (c, (struct copyexec_rpc_handshake *) (P + 3), len);
    case COPYEXEC_RPC_TYPE_SEND_DATA:
      return rpc_execute_send_data (c, (struct copyexec_rpc_send_data *) (P + 3), len);
    case COPYEXEC_RPC_TYPE_PING:
      return rpc_execute_ping (c);
  }

  return -__LINE__;
}
示例#26
0
void vector_implementation()//Vector implementation
{
	vector<Question> vec_problems;
	int correct_count = 0;
	ifstream myfile_vec;
	myfile_vec.open ("Testfile.txt");
	Question read_in("Temp", 1, "answ1", "answ2","answ3");
	for(int i=0;i<15;++i)//reads in to vector
	{
		myfile_vec>>read_in;
		vec_problems.push_back(read_in);
	}
	srand(time(0));//ensures truly random shuffle by seeding system time
	random_shuffle(vec_problems.begin(),vec_problems.end());//shuffles vector
	for(int i=0;i<10;++i)//asks question + gets answer
	{
		bool correct = false;
		int answer = 0;
		string input;
		cout<<vec_problems[i];
		cin>>input;
		if(!is_number(input) || StringToNumber(input)<0 || StringToNumber(input)>5)
			throw runtime_error("Bad answer input");
		else
			answer = StringToNumber(input);
		if(answer == vec_problems[i].correct_answer_num())
		{
			++correct_count;
			cout<<"Awesome work! onto the next question\n";
		}
		else
			cout<<"Aw too bad you missed that one, try another!\n";
	}
	if(correct_count>6)
		cout<<"You got "<<correct_count<<" Right, and passed Nice job!\n";
	else
		cout<<"You got "<<correct_count<<" Right, and failed, better luck next time\n";
	return;
}
// all tests will us a stringstream as an input
TEST_F(TestReadin, test_read_in_int){
    std::stringstream s;
    s << 1;
    int res = read_in(s, correct_int, "");
    EXPECT_EQ(1, res);
}
示例#28
0
static int
read_stage2_from_disk(int dev_fd, ig_stage2_t *stage2, int type)
{
	uint32_t		size;
	uint32_t		buf_size;
	uint32_t		mboot_off;
	multiboot_header_t	*mboot;

	assert(stage2 != NULL);
	assert(dev_fd != -1);

	if (read_in(dev_fd, mboot_scan, sizeof (mboot_scan),
	    STAGE2_BLKOFF(type) * SECTOR_SIZE) != BC_SUCCESS) {
		perror(gettext("Error reading stage2 sectors"));
		return (BC_ERROR);
	}

	/* No multiboot means no chance of knowing stage2 size */
	if (find_multiboot(mboot_scan, sizeof (mboot_scan), &mboot_off)
	    != BC_SUCCESS) {
		BOOT_DEBUG("Unable to find multiboot header\n");
		return (BC_NOEXTRA);
	}
	mboot = (multiboot_header_t *)(mboot_scan + mboot_off);

	/*
	 * Unfilled mboot values mean an older version of installgrub installed
	 * the stage2. Again we have no chance of knowing stage2 size.
	 */
	if (mboot->load_end_addr == 0 ||
	    mboot->load_end_addr < mboot->load_addr)
		return (BC_NOEXTRA);

	/*
	 * Currently, the amount of space reserved for extra information
	 * is "fixed". We may have to scan for the terminating extra payload
	 * in the future.
	 */
	size = mboot->load_end_addr - mboot->load_addr;
	buf_size = P2ROUNDUP(size + SECTOR_SIZE, SECTOR_SIZE);

	stage2->buf = malloc(buf_size);
	if (stage2->buf == NULL) {
		perror(gettext("Memory allocation failed"));
		return (BC_ERROR);
	}
	stage2->buf_size = buf_size;

	if (read_in(dev_fd, stage2->buf, buf_size, STAGE2_BLKOFF(type) *
	    SECTOR_SIZE) != BC_SUCCESS) {
		perror("read");
		free(stage2->buf);
		return (BC_ERROR);
	}

	/* Update pointers. */
	stage2->file = stage2->buf;
	stage2->file_size = size;
	stage2->mboot_off = mboot_off;
	stage2->mboot = (multiboot_header_t *)(stage2->buf + stage2->mboot_off);
	stage2->extra = stage2->buf + P2ROUNDUP(stage2->file_size, 8);
	stage2->extra_size = stage2->buf_size - P2ROUNDUP(stage2->file_size, 8);

	return (BC_SUCCESS);
}
示例#29
0
int memcache_store (struct connection *c, int op, const char *key, int key_len, int flags, int delay, int size) {
  cmd_set++;
  inode_id_t inode;
  unsigned int offset = 0;
  int act = 0;
  int x = 0, y = 0;
  struct fuse_file_info fi;
  if (size < MAX_VALUE_LEN && key_len > 0 && op == mct_set) {
    switch (*key) {
      case 'c':
        if (!strncmp (key, "chmod", 5) && sscanf (key, "chmod%d", &x) >= 1) {
          act = 6;
        }
        if (!strncmp (key, "chown", 5) && sscanf (key, "chown%d,%d", &x, &y) >= 2) {
          act = 7;
        }
        break;
      case 'm':
        if (!strncmp (key, "mkdir", 5) && sscanf (key, "mkdir%d", &x) >= 1) {
          act = 1;
        }
        break;
      case 'p':
        if (!strcmp (key, "path")) {
          act = 3;
        }
      case 'r':
        if (!strcmp (key, "rmdir")) {
          act = 4;
        }
      case 'w':
        if (sscanf (key, "write%u,%lld", &offset, &inode) >= 2) {
          act = 2;
        }
        break;
      case 'u':
        if (!strcmp (key, "unlink")) {
          act = 5;
        }
    }
    int r = -11;
    if (act) {
      assert (read_in (&c->In, value_buff, size) == size);
      value_buff[size] = 0;
      switch (act) {
        case 1:
          r = ff_mkdir (value_buff, x);
          break;
        case 2:
          fi.fh = inode;
          r = ff_write (NULL, value_buff, size, offset, &fi);
          if (r >= 0) {
            r = 0;
          }
          break;
        case 3:
          init_tmp_buffers (c);
          write_out (c->Tmp, &size, sizeof (size));
          write_out (c->Tmp, value_buff, size);
          r = 0;
          break;
        case 4:
          r = ff_rmdir (value_buff);
          break;
        case 5:
          r = ff_unlink (value_buff);
          break;
        case 6:
          r = ff_chmod (value_buff, x);
          break;
        case 7:
          r = ff_chown (value_buff, x, y);
          break;
      }
      if (!r) {
        return 1;
      }
      if (verbosity > 0 && r < 0) {
        fprintf (stderr, "store: fail (act = %d, res = %d)\n", act, r);
      }
      return 0;
    }
  }
  return -2;
}
int main(int argc, char **argv){
	FILE *file = fopen("file1","r");
	FILE *out = NULL;
	char str_buf[1024][50];
	unsigned str_buf_in = 0;
	unsigned str_buf_out = 0;
	char str[50];
	int read_finish = 0;
	int num_read = 0, num_write = 0;
	char **input_filenames = NULL;
	int input_len; //num of input files
	FILE **input_files = NULL;
	int i,j; double elapsed_time;
	int mapping_done = 0;//done when all mapper thread done
	struct timeval tvalBefore, tvalAfter;
	////locks///
	int rank, size, len;
    char name[MPI_MAX_PROCESSOR_NAME];
    omp_set_num_threads(4);
    MPI_Init(&argc, &argv);                 
    MPI_Comm_size(MPI_COMM_WORLD, &size);   
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);  
    MPI_Get_processor_name(name, &len);
    MPI_Status status;
	omp_init_lock(&worklock);
	omp_init_lock(&inclock);
	omp_init_lock(&readlock);
	omp_init_lock(&readerlock);
	omp_init_lock(&mapperlock);
	if(argc < 5){
		printf("Usage ./mapreduce -in [input files].... -out [output file]\n");
		return 0;
	}else{
		if(strcmp("-in",argv[1])){
			printf("Usage ./mapreduce -in [input files].... -out [output file]\n");
			return 0;
		}
		for(i=2;i<argc;i++){ //start from first input file
			if(!strcmp("-out",argv[i])){
				break;
			}
		}
		input_len = i - 2;
		input_filenames = (char**)malloc(sizeof(char*)*input_len);
		for(j=0;j<input_len;j++)
			input_filenames[j] = (char*)malloc(sizeof(char)*50);
		for(i=2,j=0;j<input_len;i++,j++){
			strcpy(input_filenames[j],argv[i]);
		}
		input_files = read_in(input_filenames,input_len,0);
		if(strcmp("-out",argv[2+input_len])){
			printf("output file missing, using default name 'out'\n");
			out = fopen("out","w");
		}else{
			out = fopen(argv[3+input_len],"w");
		}
	}
	omp_set_num_threads(8);
	
	fifoQ *queue_to_map = initQ(1000000, "queue_to_map");
	fifoQ *queue_to_reduce = initQ(1000000, "queue_to_map");
	fifoQ **queues_to_map = (fifoQ**)malloc(sizeof(fifoQ*)*5);
	queues_to_map[0] = initQ(1000000, "queue_to_map0");
	queues_to_map[1] = initQ(1000000, "queue_to_map1");
	queues_to_map[2] = initQ(1000000, "queue_to_map2");
	queues_to_map[3] = initQ(1000000, "queue_to_map3");
	queues_to_map[4] = initQ(1000000, "queue_to_map4");
	fifoQ **queues_to_reduce = (fifoQ**)malloc(sizeof(fifoQ*)*5);
	queues_to_reduce[0] = initQ(1000000, "queue_to_reduce0");
	queues_to_reduce[1] = initQ(1000000, "queue_to_reduce1");
	queues_to_reduce[2] = initQ(1000000, "queue_to_reduce2");
	queues_to_reduce[3] = initQ(1000000, "queue_to_reduce3");
	queues_to_reduce[4] = initQ(1000000, "queue_to_reduce4");
	fifoQ **queues_reduced = (fifoQ**)malloc(sizeof(fifoQ*)*5);
	fifoQ *final_queue = initQ(1000000, "final Q");
	
	int sendsize = input_len/size + (input_len % size - rank > 0 ? 1 : 0); //num of files send to a node
	if(rank==0){ //distribute files
		int i,j;
		char ***files_tosend = (char***)malloc(sizeof(char**)*input_len);
		int lsendsize;
		FILE **node_files;
		
		for(i=0;i<size;i++){
			lsendsize = input_len/size + (input_len % size - i > 0 ? 1 : 0); //num of files send to a node
			printf("send size of core %d is %d\n",i,lsendsize);
			files_tosend[i] = (char**)malloc(sizeof(char*)*lsendsize);
			for(j=0;j<lsendsize;j++){
				files_tosend[i][j] = (char*)malloc(sizeof(char)*50);
			}
		}
		for(i=0;i<input_len;i++){
			int belongs_to = i % size;
			int pos = i/size;
			strcpy(files_tosend[belongs_to][pos],input_filenames[i]);
			printf("distributing file %s to files_tosend %d,%d, value %s\n",input_filenames[i],belongs_to,pos,files_tosend[belongs_to][pos]);
		}
		if(size>1){
			for(i=1;i<size;i++){
				lsendsize = input_len/size + (input_len % size - i > 0 ? 1 : 0);
				for(j=0;j<lsendsize;j++){
					printf("sending %s to cpu %d\n",files_tosend[i][j],i);
					MPI_Send(files_tosend[i][j],50,MPI_BYTE,i,1,MPI_COMM_WORLD);
					printf("send done\n");
				}
			}
		}
		node_files = (FILE**)malloc(sizeof(FILE*)*sendsize);
		for(i=0;i<sendsize;i++){
			node_files[i] = fopen(files_tosend[rank][i],"r");
		}
		gettimeofday (&tvalBefore, NULL);
		#pragma omp parallel sections
		{
		
		#pragma omp section //reader thread0
		{
			int i; int odd_even = 0;
			//printf("reader 0 is core #%d\n",rank);
			for(i=0;i<sendsize;i++){
				while(!feof(node_files[i])){
	                  /////////check if full///////////
					omp_set_lock(&readerlock);
					if(!feof(node_files[i])){
						strcpy(str,"");
						fscanf(node_files[i],"%s",str);
					}
					else{
						omp_unset_lock(&readerlock);
						break;
					}
					omp_unset_lock(&readerlock);
					if(strcmp(str,""))
						putWork(queues_to_map[0], constr_work(str));
				}
			}
			omp_set_lock(&inclock);
			read_finish++;
			omp_unset_lock(&inclock);
			//printf("reader thread0 done\n");
		}
		#pragma omp section //reader thread1
		{
			int i; int odd_even = 0;
			//printf("reader 1 is core #%d\n",rank);
			for(i=0;i<sendsize;i++){
				while(!feof(node_files[i])){
	                  /////////check if full///////////
					omp_set_lock(&readerlock);
					if(!feof(node_files[i])){
						strcpy(str,"");
						fscanf(node_files[i],"%s",str);
					}
					else{
						omp_unset_lock(&readerlock);
						break;
					}
					omp_unset_lock(&readerlock);
					if(strcmp(str,""))
						putWork(queues_to_map[1], constr_work(str));
				}
			}
			omp_set_lock(&inclock);
			read_finish++;
			omp_unset_lock(&inclock);
			//printf("reader thread1 done\n");
		}
		#pragma omp section //reader thread2
		{
			int i; int odd_even = 0;
			//printf("reader 2 is core #%d\n",rank);
			for(i=0;i<sendsize;i++){
				while(!feof(node_files[i])){
	                  /////////check if full///////////
					omp_set_lock(&readerlock);
					if(!feof(node_files[i])){
						strcpy(str,"");
						fscanf(node_files[i],"%s",str);
					}
					else{
						omp_unset_lock(&readerlock);
						break;
					}
					omp_unset_lock(&readerlock);
					if(strcmp(str,""))
						putWork(queues_to_map[2], constr_work(str));
				}
			}
			omp_set_lock(&inclock);
			read_finish++;
			omp_unset_lock(&inclock);
			//printf("reader thread2 done\n");
		}
		#pragma omp section //reader thread3
		{
			//	printf("reader 3 is core #%d\n",rank);
			int i; int odd_even = 0;
			for(i=0;i<sendsize;i++){
				while(!feof(node_files[i])){
	                  /////////check if full///////////
					omp_set_lock(&readerlock);
					if(!feof(node_files[i])){
						strcpy(str,"");
						fscanf(node_files[i],"%s",str);
					}
					else{
						omp_unset_lock(&readerlock);
						break;
					}
					omp_unset_lock(&readerlock);
					if(strcmp(str,""))
						putWork(queues_to_map[3], constr_work(str));
				}
			}
			omp_set_lock(&inclock);
			read_finish++;
			omp_unset_lock(&inclock);
			//printf("reader thread3 done %d\n",rank);
		}
		#pragma omp section //mapper thread 0
		{
			int i;
			fifoQ *innerQ = initQ(50000,"innerQ 0");
			while(read_finish<NUM_READ_THREADS || !is_empty(queues_to_map[0])){
				printf("");
				if(!is_empty(queues_to_map[0])){
					work work = getWork(queues_to_map[0]);
					//mapper(queues_to_reduce[hash(work.str)], work);
					mapper(innerQ, work);
				}
			}
			for(i=0;i<=innerQ->in;i++){
				work work = getWork(innerQ);
				putWork(queues_to_reduce[hash(work.str)],work);
			}
			omp_set_lock(&inclock);
			mapping_done++;
			omp_unset_lock(&inclock);
			//printf("mapper thread0 done %d\n",rank);
			gettimeofday (&tvalAfter, NULL);
    elapsed_time = (float)(tvalAfter.tv_sec - tvalBefore.tv_sec)+((float)(tvalAfter.tv_usec - tvalBefore.tv_usec)/1000000);
    if(rank==0)
		printf("elapsed time = %.2f sec,rank %d in map 0\n",elapsed_time,rank);
		}
		#pragma omp section //mapper thread 1
		{
			int i;
			fifoQ *innerQ = initQ(50000,"innerQ 1");
			while(read_finish<NUM_READ_THREADS || !is_empty(queues_to_map[1])){
				printf("");
				if(!is_empty(queues_to_map[1])){		
					work work = getWork(queues_to_map[1]);				
					//mapper(queues_to_reduce[hash(work.str)], work);
					mapper(innerQ, work);
				}
			}
			for(i=0;i<=innerQ->in;i++){
				work work = getWork(innerQ);
				putWork(queues_to_reduce[hash(work.str)],work);
			}
			omp_set_lock(&inclock);
			mapping_done++;
			omp_unset_lock(&inclock);
			//printf("mapper thread1 done %d\n",rank);
			gettimeofday (&tvalAfter, NULL);
    elapsed_time = (float)(tvalAfter.tv_sec - tvalBefore.tv_sec)+((float)(tvalAfter.tv_usec - tvalBefore.tv_usec)/1000000);
    if(rank==0)
		printf("elapsed time = %.2f sec,rank %d in map 1\n",elapsed_time,rank);
		}
		#pragma omp section //mapper thread 2
		{
			int i;
			fifoQ *innerQ = initQ(50000,"innerQ 2");
			while(read_finish<NUM_READ_THREADS || !is_empty(queues_to_map[2])){
				printf("");
				if(!is_empty(queues_to_map[2])){		
					work work = getWork(queues_to_map[2]);				
					//mapper(queues_to_reduce[hash(work.str)], work);
					mapper(innerQ, work);
				}
			}
			for(i=0;i<=innerQ->in;i++){
				work work = getWork(innerQ);
				putWork(queues_to_reduce[hash(work.str)],work);
			}
			omp_set_lock(&inclock);
			mapping_done++;
			omp_unset_lock(&inclock);
			//printf("mapper thread2 done %d\n",rank);
			gettimeofday (&tvalAfter, NULL);
    elapsed_time = (float)(tvalAfter.tv_sec - tvalBefore.tv_sec)+((float)(tvalAfter.tv_usec - tvalBefore.tv_usec)/1000000);
    if(rank==0)
		printf("elapsed time = %.2f sec,rank %d in map 2\n",elapsed_time,rank);
		}
		#pragma omp section //mapper thread 3
		{
			int i;
			fifoQ *innerQ = initQ(50000,"innerQ 2");
			while(read_finish<NUM_READ_THREADS || !is_empty(queues_to_map[3])){
				printf("");
				if(!is_empty(queues_to_map[3])){		
					work work = getWork(queues_to_map[3]);				
					//mapper(queues_to_reduce[hash(work.str)], work);
					mapper(innerQ, work);
				}
			}
			for(i=0;i<=innerQ->in;i++){
				work work = getWork(innerQ);
				putWork(queues_to_reduce[hash(work.str)],work);
			}
			omp_set_lock(&inclock);
			mapping_done++;
			omp_unset_lock(&inclock);
			//printf("mapper thread3 done %d\n",rank);
			gettimeofday (&tvalAfter, NULL);
    elapsed_time = (float)(tvalAfter.tv_sec - tvalBefore.tv_sec)+((float)(tvalAfter.tv_usec - tvalBefore.tv_usec)/1000000);
    if(rank==0)
		printf("elapsed time = %.2f sec,rank %d in map 3\n",elapsed_time,rank);
		}
		#pragma omp section //reducer thread 0 
		{
			int i;
			gettimeofday (&tvalAfter, NULL);
    elapsed_time = (float)(tvalAfter.tv_sec - tvalBefore.tv_sec)+((float)(tvalAfter.tv_usec - tvalBefore.tv_usec)/1000000);
    if(rank==0)
		printf("elapsed time = %.2f sec,rank %d\n",elapsed_time,rank);
			while(mapping_done<NUM_READ_THREADS){
				printf("");
			}
			gettimeofday (&tvalAfter, NULL);
    elapsed_time = (float)(tvalAfter.tv_sec - tvalBefore.tv_sec)+((float)(tvalAfter.tv_usec - tvalBefore.tv_usec)/1000000);
    if(rank==0)
		printf("elapsed time = %.2f sec,rank %d\n",elapsed_time,rank);
			queues_reduced[0] = reducer(queues_to_reduce[0]);
			//printf("reducer thread 0 done\n");
			gettimeofday (&tvalAfter, NULL);
    elapsed_time = (float)(tvalAfter.tv_sec - tvalBefore.tv_sec)+((float)(tvalAfter.tv_usec - tvalBefore.tv_usec)/1000000);
    if(rank==0)
		printf("elapsed time = %.2f sec,rank %d\n",elapsed_time,rank);
		}
		#pragma omp section //reducer thread 1
		{
			int i;
			while(mapping_done<NUM_READ_THREADS){printf("");}
			queues_reduced[1] = reducer(queues_to_reduce[1]);
			//printf("reducer thread 1 done\n");
		}
		#pragma omp section //reducer thread 2 
		{
			int i;
			while(mapping_done<NUM_READ_THREADS){printf("");}
			queues_reduced[2] = reducer(queues_to_reduce[2]);
			//printf("reducer thread 2 done\n");
		}
		#pragma omp section //reducer thread 3
		{
			int i;
			while(mapping_done<NUM_READ_THREADS){printf("");}
			queues_reduced[3] = reducer(queues_to_reduce[3]);
			//printf("reducer thread 3 done\n");
		}
		}
		gettimeofday (&tvalAfter, NULL);
    elapsed_time = (float)(tvalAfter.tv_sec - tvalBefore.tv_sec)+((float)(tvalAfter.tv_usec - tvalBefore.tv_usec)/1000000);
    if(rank==0)
		printf("elapsed time = %.2f sec,rank %d\n",elapsed_time,rank);
	}
	else{
		int i;
		FILE** node_files = (FILE**)malloc(sizeof(FILE*)*sendsize);
		for(i=0;i<sendsize;i++){
			char *bufstr = (char*)malloc(sizeof(char)*50);
			MPI_Recv(bufstr,50,MPI_BYTE, 0,1, MPI_COMM_WORLD, &status);
			//printf("%s received\n",bufstr);
			node_files[i] = fopen(bufstr,"r");
		}
		#pragma omp parallel sections shared(input_files) private(str)
		{	
		//printf("using %d threads in core %d\n",omp_get_num_threads(),rank);
		#pragma omp section //reader thread0
		{
			int i; int odd_even = 0;
		//	printf("reader 0 is core #%d\n",rank);
			for(i=0;i<sendsize;i++){
				while(!feof(node_files[i])){
	                  /////////check if full///////////
					omp_set_lock(&readerlock);
					if(!feof(node_files[i])){
						strcpy(str,"");
						fscanf(node_files[i],"%s",str);
					}
					else{
						omp_unset_lock(&readerlock);
						break;
					}
					omp_unset_lock(&readerlock);
					if(strcmp(str,""))
						putWork(queues_to_map[0], constr_work(str));
				}
			}
			omp_set_lock(&inclock);
			read_finish++;
			omp_unset_lock(&inclock);
			//printf("reader thread0 done\n");
		}
		#pragma omp section //reader thread1
		{
			int i; int odd_even = 0;
		//	printf("reader 1 is core #%d\n",rank);
			for(i=0;i<sendsize;i++){
				while(!feof(node_files[i])){
	                  /////////check if full///////////
					omp_set_lock(&readerlock);
					if(!feof(node_files[i])){
						strcpy(str,"");
						fscanf(node_files[i],"%s",str);
					}
					else{
						omp_unset_lock(&readerlock);
						break;
					}
					omp_unset_lock(&readerlock);
					if(strcmp(str,""))
						putWork(queues_to_map[1], constr_work(str));
				}
			}
			omp_set_lock(&inclock);
			read_finish++;
			omp_unset_lock(&inclock);
			//printf("reader thread1 done\n");
		}
		#pragma omp section //reader thread2
		{
			int i; int odd_even = 0;
			//printf("reader 2 is core #%d\n",rank);
			for(i=0;i<sendsize;i++){
				while(!feof(node_files[i])){
	                  /////////check if full///////////
					omp_set_lock(&readerlock);
					if(!feof(node_files[i])){
						strcpy(str,"");
						fscanf(node_files[i],"%s",str);
					}
					else{
						omp_unset_lock(&readerlock);
						break;
					}
					omp_unset_lock(&readerlock);
					if(strcmp(str,""))
						putWork(queues_to_map[2], constr_work(str));
				}
			}
			omp_set_lock(&inclock);
			read_finish++;
			omp_unset_lock(&inclock);
			//printf("reader thread2 done\n");
		}
		#pragma omp section //reader thread3
		{
				//printf("reader 3 is core #%d\n",rank);
			int i; int odd_even = 0;
			for(i=0;i<sendsize;i++){
				while(!feof(node_files[i])){
	                  /////////check if full///////////
					omp_set_lock(&readerlock);
					if(!feof(node_files[i])){
						strcpy(str,"");
						fscanf(node_files[i],"%s",str);
					}
					else{
						omp_unset_lock(&readerlock);
						break;
					}
					omp_unset_lock(&readerlock);
					if(strcmp(str,""))
						putWork(queues_to_map[3], constr_work(str));
				}
			}
			omp_set_lock(&inclock);
			read_finish++;
			omp_unset_lock(&inclock);
			//printf("reader thread3 done %d\n",rank);
		}
		#pragma omp section //mapper thread 0
		{
		int i;
		fifoQ *innerQ = initQ(50000,"innerQ 0");
		//printf("map1\n");
		while(read_finish<NUM_READ_THREADS || !is_empty(queues_to_map[0])){
			printf("");
			if(!is_empty(queues_to_map[0])){
				work work = getWork(queues_to_map[0]);
				//mapper(queues_to_reduce[hash(work.str)], work);
				mapper(innerQ, work);
			}
		}
		for(i=0;i<=innerQ->in;i++){
			work work = getWork(innerQ);
			putWork(queues_to_reduce[hash(work.str)],work);
		}
		omp_set_lock(&inclock);
		mapping_done++;
		omp_unset_lock(&inclock);
		//printf("mapper thread0 done %d\n",rank);
		}
		#pragma omp section //mapper thread 1
		{
			int i;
			fifoQ *innerQ = initQ(50000,"innerQ 1");
			while(read_finish<NUM_READ_THREADS || !is_empty(queues_to_map[1])){
				printf("");
				if(!is_empty(queues_to_map[1])){		
					work work = getWork(queues_to_map[1]);				
					//mapper(queues_to_reduce[hash(work.str)], work);
					mapper(innerQ, work);
				}
			}
			for(i=0;i<=innerQ->in;i++){
				work work = getWork(innerQ);
				putWork(queues_to_reduce[hash(work.str)],work);
			}
			omp_set_lock(&inclock);
			mapping_done++;
			omp_unset_lock(&inclock);
			//printf("mapper thread1 done %d\n",rank);
		}
		#pragma omp section //mapper thread 2
		{
			int i;
			fifoQ *innerQ = initQ(50000,"innerQ 2");
			while(read_finish<NUM_READ_THREADS || !is_empty(queues_to_map[2])){
				printf("");
				if(!is_empty(queues_to_map[2])){		
					work work = getWork(queues_to_map[2]);				
					//mapper(queues_to_reduce[hash(work.str)], work);
					mapper(innerQ, work);
				}
			}
			for(i=0;i<=innerQ->in;i++){
				work work = getWork(innerQ);
				putWork(queues_to_reduce[hash(work.str)],work);
			}
			omp_set_lock(&inclock);
			mapping_done++;
			omp_unset_lock(&inclock);
			//printf("mapper thread2 done %d\n",rank);
		}
		#pragma omp section //mapper thread 3
		{
			int i;
			fifoQ *innerQ = initQ(50000,"innerQ 2");
			while(read_finish<NUM_READ_THREADS || !is_empty(queues_to_map[3])){
				printf("");
				if(!is_empty(queues_to_map[3])){			
					work work = getWork(queues_to_map[3]);				
					//mapper(queues_to_reduce[hash(work.str)], work);
					mapper(innerQ, work);
				}
			}
			for(i=0;i<=innerQ->in;i++){
				work work = getWork(innerQ);
				putWork(queues_to_reduce[hash(work.str)],work);
			}
			omp_set_lock(&inclock);
			mapping_done++;
			omp_unset_lock(&inclock);
			//printf("mapper thread3 done %d\n",rank);
		}
		#pragma omp section //reducer thread 0 
		{
			int i;
			while(mapping_done<NUM_READ_THREADS){
				printf("");
			}
			queues_reduced[0] = reducer(queues_to_reduce[0]);
			//printf("reducer thread 0 done\n");
		}
		#pragma omp section //reducer thread 1
		{
			int i;
			while(mapping_done<NUM_READ_THREADS){printf("");}
			queues_reduced[1] = reducer(queues_to_reduce[1]);
			//printf("reducer thread 1 done\n");
		}
		#pragma omp section //reducer thread 2 
		{
			int i;
			while(mapping_done<NUM_READ_THREADS){printf("");}
			queues_reduced[2] = reducer(queues_to_reduce[2]);
			//printf("reducer thread 2 done\n");
		}
		#pragma omp section //reducer thread 3
		{
			int i;
			while(mapping_done<NUM_READ_THREADS){printf("");}
			queues_reduced[3] = reducer(queues_to_reduce[3]);
			//printf("reducer thread 3 done\n");
		}
		
		}
	}
	MPI_Barrier(MPI_COMM_WORLD);
	gettimeofday (&tvalAfter, NULL);
    elapsed_time = (float)(tvalAfter.tv_sec - tvalBefore.tv_sec)+((float)(tvalAfter.tv_usec - tvalBefore.tv_usec)/1000000);
    if(rank==0)
		printf("elapsed time = %.2f sec,rank %d\n",elapsed_time,rank);
	if(rank==0){ //final reducuction
		int i,j,revbuf;int mainct;
		for(i=0;i<NUM_READ_THREADS;i++){
			combine_queue(final_queue,queues_reduced[i]);
		}
		//printf("main node has %d to final reduce\n",calcnum(queues_reduced,NUM_READ_THREADS));
		for(i=1;i<size;i++){
			MPI_Recv(&revbuf,1,MPI_INT,i,1,MPI_COMM_WORLD,&status);
			//printf("need to receive %d strings from node %d\n",revbuf,i);
			char *strbuf = (char*)malloc(sizeof(char)*50);
			char ctbuf = 0;
			for(j=0;j<revbuf;j++){
				MPI_Recv(strbuf,50,MPI_BYTE,i,1,MPI_COMM_WORLD,&status);
				MPI_Recv(&ctbuf,50,MPI_INT,i,1,MPI_COMM_WORLD,&status);
				work work;
				strcpy(work.str,strbuf);
				work.count = ctbuf;
				//printf("received <%s,%d> from node %d\n",work.str,work.count,i);
				putWork(final_queue,work);
			}
		}
		fifoQ *output = reducer(final_queue);
		printQ_to_file(&output,1,out);
	}else{
		int i,total_num;
		total_num = calcnum(queues_reduced,NUM_READ_THREADS);
		MPI_Send(&total_num,1,MPI_INT,0,1,MPI_COMM_WORLD);
		for(i=0;i<NUM_READ_THREADS;i++){
			combine_queue(final_queue,queues_reduced[i]);
		}
		for(i=0;i<total_num;i++){
			MPI_Send(&final_queue->works[i].str,50,MPI_BYTE,0,1,MPI_COMM_WORLD);
			MPI_Send(&final_queue->works[i].count,1,MPI_INT,0,1,MPI_COMM_WORLD);
		}
	}
	
	for(i=0;i<input_len;i++){
		fclose(input_files[i]);
	}
	fclose(out);
	/*printQ(queues_to_map[0]);
	printQ(queues_to_map[1]);
	printQ(queues_to_map[2]);
	printQ(queues_to_map[3]);*/
	/*printQ(queues_reduced[0]);
	printQ(queues_reduced[1]);
	printQ(queues_reduced[2]);
	printQ(queues_reduced[3]);*/
	omp_destroy_lock(&inclock);
	omp_destroy_lock(&worklock);
	omp_destroy_lock(&readlock);
	omp_destroy_lock(&readerlock);
	omp_destroy_lock(&mapperlock);
	MPI_Finalize();

	return 0;
}