예제 #1
0
파일: achtool.c 프로젝트: KimBP/ach
int cmd_create(void) {
    if( opt_verbosity > 0 ) {
        fprintf(stderr, "Creating Channel %s\n", opt_chan_name);
    }
    if( opt_msg_cnt < 1 ) {
        fprintf(stderr, "Message count must be greater than zero, not %"PRIuPTR".\n", opt_msg_cnt);
        return -1;
    }
    if( opt_msg_size < 1 ) {
        fprintf(stderr, "Message size must be greater than zero, not %"PRIuPTR".\n", opt_msg_size);
        return -1;
    }
    ach_status_t i;
    {
        ach_create_attr_t attr;
        ach_create_attr_init(&attr);
        if( opt_truncate ) attr.truncate = 1;
        i = ach_create( opt_chan_name, opt_msg_cnt, opt_msg_size, &attr );
    }

    if( ! (opt_1 && i == ACH_EEXIST) ) {
        check_status( i, "Error creating channel '%s'", opt_chan_name );
    } else i = ACH_OK;

    if( opt_mode > 0 ) {
        i = cmd_chmod();
    }

    return i;
}
예제 #2
0
파일: ach-bench.c 프로젝트: LofaroLabs/ach
void setup_ach(void) {
    /* create channel */
    enum ach_status r = ach_unlink("bench");               /* delete first */
    if( ! ach_status_match(r, ACH_MASK_OK | ACH_MASK_ENOENT) ) abort();
    ach_create_attr_t cattr;
    if (KERNDEV) {
        ach_create_attr_init(&cattr);
        cattr.map = ACH_MAP_KERNEL;
    }
    r = ach_create("bench", 10, 256, KERNDEV ? &cattr : NULL );
    if(ACH_OK != r) abort();

    /* open channel */
    r = ach_open(&chan, "bench", NULL);
    if(ACH_OK != r) abort();
}
예제 #3
0
파일: ach-bench.c 프로젝트: LofaroLabs/ach
void init_time_chan(void) {
    /* create channel */
    ach_create_attr_t cattr;
    enum ach_status r = ach_unlink("time");               /* delete first */
    if( ! ach_status_match(r, ACH_MASK_OK | ACH_MASK_ENOENT) ) abort();
    if (KERNDEV) {
        ach_create_attr_init(&cattr);
        cattr.map = ACH_MAP_KERNEL;
    }
    r = ach_create("time", (size_t)FREQUENCY*(size_t)SECS*RECV_RT,
                   sizeof(float), KERNDEV ? &cattr : NULL );
    if(ACH_OK != r) abort();

    /* open channel */
    r = ach_open(&time_chan, "time", NULL);
    if(ACH_OK != r) abort();
}
예제 #4
0
int ach_move_init() {
  // Channels
  int r = 0;
  printf("ACH: Creating Channel\n");
  ach_create_attr_t attr;
  ach_create_attr_init(&attr);
  r = ach_create((char*)craftyo_chan_name, 100, IBOARDSTATE_SIZE+IMOVESTRING_SIZE, &attr);
  printf("ACH: %s\n", ach_result_to_string((ach_status_t)r));

  printf("ACH: Opening Channel\n");
  craftyo_chan = (ach_channel_t*) malloc (sizeof(ach_channel_t));
  if(craftyo_chan == NULL) return 0;
  r = ach_open(craftyo_chan, craftyo_chan_name, NULL);
  if(r != ACH_OK) {
	  printf("ACH: %s\n", ach_result_to_string((ach_status_t)r));
	  return 0;
  }

  ach_chmod(craftyo_chan, SOMATIC_CHANNEL_MODE );

  r = ach_flush(craftyo_chan);

  if(r != ACH_OK) {
	  printf("ACH: %s\n", ach_result_to_string((ach_status_t)r));
	  return 0;
  }

  // Data
  craftyo_message = (Somatic__Crafty*)malloc(sizeof(Somatic__Crafty));
  if(craftyo_message == NULL) return 0;
  somatic__crafty__init(craftyo_message);
  //craftyo_message->boardstate.data = (uint8_t*) malloc(128);
  //craftyo_message->has_boardstate = 1;
  //craftyo_message->boardstate.len = 128;
  craftyo_message->move = (char*)malloc(10);

  printf("ACH: Info\n"
		 "ACH: Name: %s\n"
		 "ACH: Size: %d\n", craftyo_chan_name, somatic__crafty__get_packed_size(craftyo_message));

  return 1;
}
예제 #5
0
파일: klinuxtest.c 프로젝트: LofaroLabs/ach
static int testsig(void)
{
    enum ach_status r;
    /* Fork 0 */
    pid_t pid_p = fork();
    check_errno( "Fork 0", pid_p );

    /* GP: wait */
    if( pid_p ) {
        return testsig_gp(pid_p);
    }

    /* Parent */
    /* Create Kernel Channel */
    {
        ach_create_attr_t attr;
        ach_create_attr_init(&attr);
        attr.map = ACH_MAP_KERNEL;

        r = ach_unlink(OPT_CHAN);
        if( ! ach_status_match(r, ACH_MASK_OK | ACH_MASK_ENOENT) ) {
            fail_ach( "unlink before create", r );
        }
        r = ach_unlink(OPT_CHAN);
        if( ACH_ENOENT != r ) fail_ach( "unlink noent", r );

        check_ach( "ach_create",
                   ach_create( OPT_CHAN, opt_msg_cnt, opt_msg_size, &attr ) );
    }
    /* Open Kernel Channel */
    struct ach_channel chan;
    {
        for(;;) {
            usleep(1000); /* Race against udev */
            r = ach_open( &chan, OPT_CHAN, NULL );
            if( ACH_EACCES == r ) continue;
            else if (ACH_OK == r) break;
            else fail_ach("ach_open", r);

        }
    }

    /* Install Parent sighandler */
    sighandler_install();

    /* fork 1 */
    pid_t pid_c = fork();
    check_errno( "fork 1", pid_c );

    if( pid_c ) {
        /* Parent: */
        for(;;) {
            usleep(10000); /* Racy... */
            check_errno( "kill child", kill( pid_c, SIGUSR1) );
            usleep(10000);
            int i = 42;
            check_ach( "put to child",  ach_put( &chan, &i, sizeof(i) ) );
            int status;
            pid_t wp = waitpid( pid_c, &status, WNOHANG );
            if( wp ) {
                if( wp != pid_c ) {
                    fail_errno("Wait 1");
                } else if( WIFEXITED(status) && (0 == WEXITSTATUS(status)) ) {
                    exit(EXIT_SUCCESS);
                } else {
                    fprintf(stderr, "Child 1 failed\n");
                    exit(EXIT_FAILURE);
                }
            }
        }
    } else {
        /* child */
        sig_atomic_t s0, s1;
        int i;
        do {
            size_t frame_size;
            s0 = count_sigusr1;
            r = ach_get(&chan, &i, sizeof(i), &frame_size, NULL, ACH_O_WAIT  );
            s1 = count_sigusr1;
            check_ach("child sig get", r);
        } while( s1 == s0 || s1 < 10 ); /* This is racy... */
        printf("done: %s, %d,%d,%d\n", ach_result_to_string(r), s0, s1, i);
        exit(EXIT_SUCCESS);
    }

    return 0;
}