int hal_heap_addmem(size_t click) { size_t actual = RTAPI_ALIGN(click, RTAPI_CACHELINE); HALDBG("extending arena by %zu bytes", actual); if (hal_freemem() < HAL_HEAP_MINFREE) { HALERR("can't extend arena - below minfree: %zu", hal_freemem()); return 0; } if (rtapi_heap_addmem(&hal_data->heap, SHMPTR(hal_data->shmem_bot), actual)) { HALFAIL_RC(ENOMEM, "rtapi_heap_addmem(%zu) failed", actual); } hal_data->shmem_bot += actual; return 0; }
int rtapi_app_main(void) { int retval; dlist_init_entry(&head); if ((comp_id = hal_xinit(TYPE_RT, 0, 0, instantiate_encoder_pair, delete_encoder_pair, compname)) < 0) return comp_id; hal_export_xfunct_args_t u = { .type = FS_XTHREADFUNC, .funct.x = update, .arg = &head, .uses_fp = 1, .reentrant = 0, .owner_id = comp_id }; if ((retval = hal_export_xfunctf(&u, "%s.update", prefix)) < 0) return retval; hal_export_xfunct_args_t mp = { .type = FS_XTHREADFUNC, .funct.x = sample, .arg = &head, .uses_fp = 0, .reentrant = 0, .owner_id = comp_id }; if ((retval = hal_export_xfunctf(&mp, "%s.sample", prefix)) < 0) return retval; hal_ready(comp_id); return 0; } void rtapi_app_exit(void) { hal_exit(comp_id); } static int instantiate_encoder_pair(const int argc, const char**argv) { encoder_pair_t *p; int retval; int msg; const char* name; if(argc >= 2) name = argv[1]; else HALFAIL_RC(EINVAL, "ERROR: insufficient args in argv"); /* This function exports a lot of stuff, which results in a lot of logging if msg_level is at INFO or ALL. So we save the current value of msg_level and restore it later. */ msg = rtapi_get_msg_level(); #ifndef VERBOSE_SETUP rtapi_set_msg_level(RTAPI_MSG_WARN); #endif if ((retval = hal_inst_create(name, comp_id, sizeof(encoder_pair_t), (void **)&p)) < 0) return retval; p->inst_id = retval; if ((retval = export_encoder_pair(name, p->inst_id, p)) != 0) HALFAIL_RC(retval, "%s: ERROR: export(%s) failed", compname, name); // append to instance list dlist_init_entry(&p->list); dlist_add_after(&p->list, &head); /* restore saved message level */ rtapi_set_msg_level(msg); return 0; }