static load_thread_info_t* get_load_ti(){ load_thread_info_t *lti; pthread_once(&load_thread_once, load_thread_key_alloc); lti = pthread_getspecific(load_thread_key); if (DFSCH_UNLIKELY(!lti)){ lti = GC_MALLOC_UNCOLLECTABLE(sizeof(load_thread_info_t)); lti->operation = NULL; pthread_setspecific(load_thread_key, lti); } return lti; }
static current_ports_t* current_ports(){ current_ports_t* cp; pthread_once(¤t_ports_key_init, current_ports_key_alloc); cp = pthread_getspecific(current_ports_key); if (DFSCH_UNLIKELY(!cp)){ cp = GC_NEW_UNCOLLECTABLE(current_ports_t); cp->output_port = (dfsch_object_t*)&null_port; cp->input_port = (dfsch_object_t*)&null_port; cp->error_port = (dfsch_object_t*)&null_port; pthread_setspecific(current_ports_key, cp); } return cp; }