示例#1
0
/*****************************************************************************
 *  setup_pkt_channels
 *****************************************************************************/
int setup_pkt_channels(int task_id)
{
  mcapi_status_t status;
  mcapi_request_t request;
  size_t dummy;
  

  /* create/ get endpoints */
  if (setup_echo_endpoints(task_id) != 0) {
    return -1;
  }


  /* connect the write channel only */
  mcapi_pktchan_connect_i(local_endpts[task_id].endpts[WRITE_IDX],
                          remote_endpts[task_id], 
                          &request, &status);
  if (status != MCAPI_SUCCESS) {
    th_log_error("Task id %d failed to initialize (1): %s\n",
                 task_id, mcapi_display_status(status,status_buff,sizeof(status_buff)));
    return -1;
  }
  mcapi_wait(&request, &dummy, TIMEOUT,&status);
  if (status != MCAPI_SUCCESS) {
    th_log_error("Task id %d failed to initialize (2): %s\n",
                 task_id, mcapi_display_status(status,status_buff,sizeof(status_buff)));
    return -1;
  }

  /* open the write channel */
  mcapi_pktchan_send_open_i(&(pkt_hndls[task_id].send),
                            local_endpts[task_id].endpts[WRITE_IDX], 
                            &request, &status);
  if (status != MCAPI_SUCCESS) {
    th_log_error("Task id %d failed to initialize (3) : %s\n",
                 task_id, mcapi_display_status(status,status_buff,sizeof(status_buff)));
    return -1;
  }
  mcapi_wait(&request, &dummy, TIMEOUT,&status);
  if (status != MCAPI_SUCCESS) {
    th_log_error("Task id %d failed to initialize (4) : %s\n",
                 task_id, mcapi_display_status(status,status_buff,sizeof(status_buff)));
    return -1;
  }

  /* open the read channel */
  /* the read channel may not yet be connected */
  mcapi_pktchan_recv_open_i(&(pkt_hndls[task_id].recv),
                              local_endpts[task_id].endpts[READ_IDX], 
                              &request, &status);
  mcapi_wait(&request, &dummy, TIMEOUT,&status);
  if (status != MCAPI_SUCCESS) {
    th_log_error("Task id %d failed to initialize (5) : %s\n",
                 task_id, mcapi_display_status(status,status_buff,sizeof(status_buff)));
    return -1;
  }

  return 0;
}
示例#2
0
int main()
{
    //status message received in almost all MCAPI-calls
    mcapi_status_t status;
    //info-struct received in initialization
    mcapi_info_t info;
    //the status code converted to string
    char status_msg[MCAPI_MAX_STATUS_MSG_LEN];
    //an iterator used in loops
    unsigned int i = 0;
    //request handle is used to operate wait-calls
    mcapi_request_t request;
    //size parameter required in some calls
    size_t size = 1;
    //send-handle used in channel-messaging
    mcapi_pktchan_send_hndl_t handy;
    //a separate receive buffer used for messages
    char recv_msg[MAX_MSG_LEN];
    //get our stuff here. tip: if signed were used, it bastardized the values
    unsigned char* recv_buf;

    //the endpoints used in channel-oriented communication
    mcapi_endpoint_t green_chan;
    mcapi_endpoint_t yellow_chan;
    mcapi_endpoint_t green_msg_point;

    printf( COLOR "here\n");

    //we are the green
    mcapi_initialize( THE_DOMAIN, GREEN_NODE, 0, 0, &info, &status );
    check( MCAPI_SUCCESS, status );

    //create our message endpoint
    green_msg_point = mcapi_endpoint_create( GREEN_MSG, &status );
    check( MCAPI_SUCCESS, status );
    //wait for the start signal
    mcapi_msg_recv(green_msg_point, recv_msg, MAX_MSG_LEN, &size,
    &status );
    check( MCAPI_SUCCESS, status );
    printf(COLOR "signal received, starting to connect & open\n");

    //create our channel message endpoint
    green_chan = mcapi_endpoint_create( GREEN_PKT, &status );
    check( MCAPI_SUCCESS, status );
    //get their channel message endpoint
    yellow_chan = mcapi_endpoint_get( THE_DOMAIN,
    YELLOW_NODE, YELLOW_PKT, TIMEOUT, &status );
    check( MCAPI_SUCCESS, status );
    //form the channel
    mcapi_pktchan_connect_i( yellow_chan, green_chan, &request, &status );
    check( MCAPI_PENDING, status );
    //wait for it to happen
    mcapi_wait( &request, &size, TIMEOUT, &status );
    check( MCAPI_SUCCESS, status );
    //open our end
    mcapi_pktchan_recv_open_i( &handy, green_chan, &request, &status );
    check( MCAPI_PENDING, status );
    //wait for it to happen
    mcapi_wait( &request, &size, TIMEOUT, &status );
    check( MCAPI_SUCCESS, status );

    printf(COLOR "beginning the receive\n");

    //start to receive our stuff
    mcapi_pktchan_recv( handy, (void*)&recv_buf, &size, &status );
    check( MCAPI_SUCCESS, status );
    
    printf(COLOR "retrieval done, closing\n");

    //close our end
    mcapi_pktchan_recv_close_i( handy, &request, &status );
    check( MCAPI_PENDING, status );
    //wait for it to happen
    mcapi_wait( &request, &size, TIMEOUT, &status );
    check( MCAPI_SUCCESS, status );

    printf(COLOR "closed, go over the values\n");

    //go through that stuff
    //i+=2 because our values are two bytes while buf is one byte
    for ( i = 0; i < size; i+=2 )
    {
        //reconstruct the short
        short sumval = recv_buf[i+1] << 8 | recv_buf[i];
        //printf( COLOR "%hX %hhX %hhX\n", sumval, recv_buf[i], recv_buf[i+1] );
    }

    printf(COLOR "buffer release and shut down\n");

    //release
    mcapi_pktchan_release( recv_buf, &status );
    check( MCAPI_SUCCESS, status );

    //finalize at the end, regardless of which process we are
    mcapi_finalize( &status );
    check( MCAPI_SUCCESS, status );

    return EXIT_SUCCESS;
}
示例#3
0
int main(int argc, char** argv) {
  mcapi_boolean_t recv_done = MCAPI_FALSE;
  mcapi_boolean_t send_done = MCAPI_FALSE;

  mca_status_t status;
  mcapi_request_t request;
  size_t size;
  int num_sends,num_recvs,order,i;
  struct timeval tv;
  unsigned int seed;
  mcapi_endpoint_t recv_endpt;
  mcapi_endpoint_t send_endpt;
  int rc = 0;
  mcapi_param_t parms;
  mcapi_info_t version;
  mcapi_set_debug_level(6);

  memset(&send_requests,0,sizeof(send_requests));
  memset(&recv_requests,0,sizeof(recv_requests));
 
  /* initialize the random number generator with a seed */
  if (argc == 2) {
    seed = atoi(argv[1]);
  } else {
    gettimeofday(&tv,0);
    seed = tv.tv_sec + tv.tv_usec;
  }
  printf("Using seed:[%u]\n",seed);
  srand(seed);
  
  /* create a node */
  mcapi_initialize(DOMAIN,NODE,NULL,&parms,&version,&status);
  if (status != MCAPI_SUCCESS) {
    fprintf(stderr,"\nERROR: Failed to initialize (0): %s\n",mcapi_display_status(status,status_buff,sizeof(status_buff)));  
    rc++;
    mcapi_finalize(&status); 
    return rc; 
  }
  
  /* create the endpoints */
  send_endpt = mcapi_endpoint_create(1,&status);
  recv_endpt =  mcapi_endpoint_create(2,&status);

  
    /*************************** connect the channels *********************/
  do {
    mcapi_pktchan_connect_i(send_endpt,recv_endpt,&request,&status);
    //retry if all request handles are in-use
  } while (status == MCAPI_ERR_REQUEST_LIMIT);
  while (!mcapi_test(&request,&size,&status)) {}
  if (status != MCAPI_SUCCESS) { 
    fprintf(stderr,"\nERROR: Failed to initialize (1): %s\n",mcapi_display_status(status,status_buff,sizeof(status_buff)));
    rc++;
    mcapi_finalize(&status); 
    return rc; 
  }
  
  /*************************** open the channels *********************/
  do {
    mcapi_pktchan_recv_open_i(&r1 /*recv_handle*/,recv_endpt, &request, &status);
    //retry if all request handles are in-use
  } while (status == MCAPI_ERR_REQUEST_LIMIT);
  while (!mcapi_test(&request,&size,&status)) {}
  if (status != MCAPI_SUCCESS) { 
    fprintf(stderr,"\nERROR: Failed to initialize (2): %s\n",mcapi_display_status(status,status_buff,sizeof(status_buff)));
    rc++;
    mcapi_finalize(&status); 
    return rc; 
  }
  
  do {
    mcapi_pktchan_send_open_i(&s1 /*send_handle*/,send_endpt, &request, &status);
    //retry if all request handles are in-use
  } while (status == MCAPI_ERR_REQUEST_LIMIT);
  while (!mcapi_test(&request,&size,&status)) {}
  if (status != MCAPI_SUCCESS) { 
    fprintf(stderr,"\nERROR: Failed to initialize (3): %s\n",mcapi_display_status(status,status_buff,sizeof(status_buff)));
    rc++;
    mcapi_finalize(&status); 
    return rc; 
  }
  
  /* randomly issue sends and receives */
  printf("sending and receiving num_msgs=%d\n",NUM_MSGS);
  while (!(recv_done && send_done)) {
    if (send_done) { order = 1; }
   else if (recv_done) { order = 0; }
   else { order = get_random(); }
    if (order % 2) {
      /* do some receives */
      num_recvs = get_random();
      printf("issuing %i receives...\n",num_recvs); 
      for (i = 0; i < num_recvs; i++) {
       recv_done = receiver();
      }
    } else {
      /* do some sends */
      num_sends = get_random();
      printf("issuing %i sends...\n",num_sends); 
      for (i = 0; i < num_sends; i++) {
        send_done = sender();
      }
    } 
  }
  
  rc =check_results();
  
  
  mcapi_finalize(&status);
  if (status != MCAPI_SUCCESS) {
    fprintf(stderr,"\nERROR: Failed to finalize: %s\n",mcapi_display_status(status,status_buff,sizeof(status_buff)));  
    rc++;
  }
  
  
  if (rc == 0) {
    printf("   Test PASSED\n");
  } else {
    printf("   Test FAILED\n");
  }
 return rc;
}
示例#4
0
int main () {
  size_t size;
  mcapi_endpoint_t ep1,ep2;
  mcapi_pktchan_send_hndl_t s1; /* s1 = ep1->ep2 */
  mcapi_pktchan_recv_hndl_t r1; /* r1 = ep1->ep2 */
  int i = 0;
  int rc = 1;
  mca_status_t status;
  mcapi_request_t request;
mcapi_param_t parms;
  mcapi_info_t version;

  mcapi_set_debug_level(6);

  /* create a node */
  mcapi_initialize(DOMAIN,NODE,NULL,&parms,&version,&status);
  if (status != MCAPI_SUCCESS) { WRONG }
    
  /* create endpoints */
  ep1 = mcapi_endpoint_create(PORT_NUM1,&status);
  if (status != MCAPI_SUCCESS) { WRONG }

  ep2 = mcapi_endpoint_create(PORT_NUM2,&status);
  if (status != MCAPI_SUCCESS) { WRONG }
 
  /*************************** connect the channels *********************/
do {
    mcapi_pktchan_connect_i(ep1,ep2,&request,&status);
//retry if all request handles are in-use
} while (status == MCAPI_ERR_REQUEST_LIMIT);
  while (!mcapi_test(&request,&size,&status)) {}
  if (status != MCAPI_SUCCESS) { WRONG }

  /*************************** open the channels *********************/
do {
    mcapi_pktchan_recv_open_i(&r1 /*recv_handle*/,ep2, &request, &status);
//retry if all request handles are in-use
} while (status == MCAPI_ERR_REQUEST_LIMIT);
  while (!mcapi_test(&request,&size,&status)) {}
  if (status != MCAPI_SUCCESS) { WRONG }
  
do {
    mcapi_pktchan_send_open_i(&s1 /*send_handle*/,ep1, &request, &status);
//retry if all request handles are in-use
} while (status == MCAPI_ERR_REQUEST_LIMIT);
  while (!mcapi_test(&request,&size,&status)) {}
  if (status != MCAPI_SUCCESS) { WRONG }

  /* tests: recv send send recv obeys FIFO */
do {
    mcapi_pktchan_recv_i(r1,(void **)((void*)&requests[i].buffer),&requests[i].request,&requests[i].status);
//retry if all request handles are in-use
} while (status == MCAPI_ERR_REQUEST_LIMIT);
  i++;
do {
    mcapi_pktchan_send_i(s1,"one",sizeof("one"),&requests[i].request,&requests[i].status);
//retry if all request handles are in-use
} while (status == MCAPI_ERR_REQUEST_LIMIT);
  i++;
do {
    mcapi_pktchan_send_i(s1,"two",sizeof("two"),&requests[i].request,&requests[i].status);
//retry if all request handles are in-use
} while (status == MCAPI_ERR_REQUEST_LIMIT);
  i++;
do {
    mcapi_pktchan_recv_i(r1,(void **)((void*)&requests[i].buffer),&requests[i].request,&requests[i].status);
//retry if all request handles are in-use
} while (status == MCAPI_ERR_REQUEST_LIMIT);
  i++;
 
  rc = check_results();

  /* close the channels */
do {
    mcapi_pktchan_recv_close_i(r1,&request,&status);     
//retry if all request handles are in-use
} while (status == MCAPI_ERR_REQUEST_LIMIT);
  while (!mcapi_test(&request,&size,&status)) {}
  if (status != MCAPI_SUCCESS) { WRONG }
                                                                                                                                      
do {
    mcapi_pktchan_send_close_i(s1,&request,&status); 
//retry if all request handles are in-use
} while (status == MCAPI_ERR_REQUEST_LIMIT);
  while (!mcapi_test(&request,&size,&status)) {}
  if (status != MCAPI_SUCCESS) { WRONG }

  mcapi_finalize(&status);
  if (rc == 0) {
    printf("   Test PASSED\n");
  } else {
    printf("   Test FAILED\n");
  }
  return rc;
}