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; }
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(); }
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(); }
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; }
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; }