예제 #1
0
파일: main.c 프로젝트: cherry-wb/quietheart
static void * thr_fn0(void *arg)
{
	printids("new thread0: ");
	char input_buf1[INPUT_LEN];
	char input_buf2[INPUT_LEN];
	int i;
	int str_len;
	int sent;
	comm_create(device1, nblks, blksz);
	comm_create(device2, nblks, blksz);

	/*read input from standard I/O, one line at a time, input_buf2 reverses input_buf1.*/
	while(NULL != fgets(input_buf1, INPUT_LEN-1, stdin))
	{
		str_len = strlen(input_buf1);
		input_buf1[str_len - 1] = '\0';
		str_len = strlen(input_buf1);
		for(i = 0; i < str_len; ++i)
		{
			input_buf2[i] = input_buf1[str_len-1-i];
		}
		input_buf2[i] = '\0';
		comm_info("Thread0 send input1:%s, length is:%d\n", input_buf1, str_len);
		sent = comm_send(device1, input_buf1, str_len);
		comm_info("Thread0 sent length is:%d\n", sent);

		comm_info("Thread0 send input2:%s, length is:%d\n", input_buf2, str_len);
		sent = comm_send(device2, input_buf2, str_len);
		comm_info("Thread0 sent length is:%d\n", sent);
	}
}
예제 #2
0
 TreeCommunicator::TreeCommunicator(const std::vector<int> &fan_out, GlobalPolicy *global_policy, const MPI_Comm &comm)
     : m_fan_out(fan_out)
     , m_comm(fan_out.size())
     , m_global_policy(global_policy)
     , m_level(fan_out.size())
 {
     mpi_type_create();
     comm_create(comm);
     level_create();
 }
예제 #3
0
파일: main.c 프로젝트: cherry-wb/quietheart
static int single_thread_test()
{
    char send_str[] = "send data";
    int send_count = sizeof(send_str);
	int sent = 0;
    char recv_str[10] = {'\0',};
    int rcv_len;
	int received = 0;
	int device = 0;/*which device [0,31]*/
	int times = 1;
    comm_initialize(device,COMM_NBLOCK);

#if 1
/*XXX test create*/
    comm_info("Test create start.\n");
	comm_create(device, nblks, blksz);
    comm_info("Test create end.\n");
#endif

#if 1
/*XXX test send and receive one time.*/
    comm_info("Test send start.\n");
    comm_info("Send data is:%s\n",send_str);
	sent = comm_send(device, send_str, send_count);
    comm_info("Sent length is:%d\n",sent);

    comm_info("Test receive start.\n");
	do
	{
		rcv_len = comm_getlen(device);
	}while(rcv_len < 0);
	comm_receive(device, recv_str, rcv_len);
    comm_info("Received data is:%s\n",recv_str);
    comm_info("Received length is:%d\n",rcv_len);
#endif

#if 1
/*XXX test send and receive many times*/
	while(times<6)
	{
		comm_info("times:%d.\n",times);
		send_str[0]+=1;
		times +=1;
		comm_info("Test send start.\n");
		comm_info("Send data is:%s\n",send_str);
		sent = comm_send(device, send_str, send_count);
		comm_info("Sent length is:%d\n",sent);

		comm_info("Test receive start.\n");
		do
		{
			rcv_len = comm_getlen(device);
		}while(rcv_len < 0);
		comm_receive(device, recv_str, rcv_len);
		comm_info("Received data is:%s\n",recv_str);
		comm_info("Received length is:%d\n",rcv_len);
	}
#endif

    comm_release(device);
	comm_info("Test end.\n");
}
예제 #4
0
파일: conn.c 프로젝트: erikarn/libiapp
struct conn *
conn_new(struct fde_head *h, struct cfg *cfg, struct shm_alloc_state *sm,
    int fd, conn_owner_update_cb *cb, void *cbdata)
{
	struct conn *c;
	char *buf;
	int i;
	int sn;

	c = calloc(1, sizeof(*c));
	if (c == NULL) {
		warn("%s: calloc", __func__);
		return (NULL);
	}

	c->r.size = cfg->io_size;
	c->r.buf = malloc(c->r.size);
	if (c->r.buf == NULL) {
		warn("%s: malloc", __func__);
		free(c);
		return (NULL);
	}

	c->w.nb = iapp_netbuf_alloc(sm, cfg->atype, cfg->io_size);
	if (c->w.nb == NULL) {
		warn("%s: iapp_netbuf_alloc", __func__);
		free(c->r.buf);
		free(c);
		return (NULL);
	}

	/* Pre-populate with some data */
	buf = iapp_netbuf_buf_nonconst(c->w.nb);
	for (i = 0; i < iapp_netbuf_size(c->w.nb); i++) {
		buf[i] = (i % 10) + '0';
	}

	/*
	 * Limit the send size to one buffer for now.
	 *
	 * This isn't optimal but until we queue multiple buffers
	 * via sendfile, we will end up queueing the same memory region
	 * over and over again via different mbufs to the same socket
	 * and that isn't at all useful or correct.
	 *
	 * Once the shm allocator handles returning buffers, we can
	 * modify the transmit path to allocate buffers as required and
	 * then keep up to two in flight.  Then we can just remove
	 * this limit.
	 */
	sn = cfg->io_size;
	if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &sn, sizeof(sn)) < 0)
		warn("%s: setsockopt(SO_SNDBUF)", __func__);

	c->fd = fd;
	c->comm = comm_create(fd, h, client_ev_close_cb, c);
	c->ev_cleanup = fde_create(h, -1, FDE_T_CALLBACK, 0,
	    client_ev_cleanup_cb, c);
	c->state = CONN_STATE_RUNNING;

	/* Link back to the parent fde loop */
	c->h = h;

	/* .. and the callback state for notification */
	c->cb.cb = cb;
	c->cb.cbdata = cbdata;

#if 0
	/*
	 * Start reading!
	 */
	(void) comm_read(c->comm, c->r.buf, c->r.size, client_read_cb, c);
#endif

	/*
	 * Start writing!
	 */
	comm_write(c->comm, c->w.nb, 0, iapp_netbuf_size(c->w.nb), conn_write_cb, c);

	return (c);
}