void detach_os_thread(init_thread_data *scribble) { struct thread *th = arch_os_get_current_thread(); odxprint(misc, "detach_os_thread: detaching"); undo_init_new_thread(th, scribble); odxprint(misc, "deattach_os_thread: detached"); pthread_setspecific(lisp_thread, (void *)0); thread_sigmask(SIG_SETMASK, &scribble->oldset, 0); free_thread_struct(th); }
void rtapi_app_exit(void) { int retval; hal_print_msg(RTAPI_MSG_DBG, "HAL_LIB:%d removing RT support\n",rtapi_instance); hal_proc_clean(); { hal_thread_t *thread __attribute__((cleanup(halpr_autorelease_mutex))); /* grab mutex before manipulating list */ rtapi_mutex_get(&(hal_data->mutex)); /* must remove all threads before unloading this module */ while (hal_data->thread_list_ptr != 0) { /* point to a thread */ thread = SHMPTR(hal_data->thread_list_ptr); /* unlink from list */ hal_data->thread_list_ptr = thread->next_ptr; /* and delete it */ free_thread_struct(thread); } } /* release RTAPI resources */ retval = rtapi_shmem_delete(lib_mem_id, lib_module_id); if (retval) { hal_print_msg(RTAPI_MSG_ERR, "HAL_LIB:%d rtapi_shmem_delete(%d,%d) failed: %d\n", rtapi_instance, lib_mem_id, lib_module_id, retval); } retval = rtapi_exit(lib_module_id); if (retval) { hal_print_msg(RTAPI_MSG_ERR, "HAL_LIB:%d rtapi_exit(%d) failed: %d\n", rtapi_instance, lib_module_id, retval); } /* done */ hal_print_msg(RTAPI_MSG_DBG, "HAL_LIB:%d RT support removed successfully\n", rtapi_instance); }