static void rtems_rap_app_free (rtems_rap_app_t* app) { if (app->handle) { dlclose (app->handle); app->handle = NULL; } if (!rtems_chain_is_node_off_chain (&app->node)) rtems_chain_extract (&app->node); }
void rtems_rtl_symbol_obj_erase (rtems_rtl_obj_t* obj) { rtems_rtl_symbol_obj_erase_local (obj); if (obj->global_table) { rtems_rtl_obj_sym_t* sym; size_t s; for (s = 0, sym = obj->global_table; s < obj->global_syms; ++s, ++sym) if (!rtems_chain_is_node_off_chain (&sym->node)) rtems_chain_extract (&sym->node); rtems_rtl_alloc_del (RTEMS_RTL_ALLOC_SYMBOL, obj->global_table); obj->global_table = NULL; obj->global_size = 0; obj->global_syms = 0; } }
static void bsp_interrupt_server_trigger(void *arg) { rtems_interrupt_lock_context lock_context; bsp_interrupt_server_entry *e = arg; bsp_interrupt_vector_disable(e->vector); rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context); if (rtems_chain_is_node_off_chain(&e->node)) { rtems_chain_append_unprotected(&bsp_interrupt_server_chain, &e->node); } else { ++bsp_interrupt_server_errors; } rtems_interrupt_lock_release(&bsp_interrupt_server_lock, &lock_context); rtems_event_system_send(bsp_interrupt_server_id, RTEMS_EVENT_SYSTEM_SERVER); }
bool rtems_rtl_obj_free (rtems_rtl_obj_t* obj) { if (obj->users || ((obj->flags & RTEMS_RTL_OBJ_LOCKED) != 0)) { rtems_rtl_set_error (EINVAL, "cannot free obj still in use"); return false; } if (!rtems_chain_is_node_off_chain (&obj->link)) rtems_chain_extract (&obj->link); rtems_rtl_alloc_module_del (&obj->text_base, &obj->const_base, &obj->data_base, &obj->bss_base); rtems_rtl_symbol_obj_erase (obj); rtems_rtl_obj_free_names (obj); if (obj->sec_num) free (obj->sec_num); if (obj->detail) rtems_rtl_alloc_del (RTEMS_RTL_ALLOC_OBJECT, (void*)obj->detail); rtems_rtl_alloc_del (RTEMS_RTL_ALLOC_OBJECT, obj); return true; }