void rpc_ss_set_thread_handle ( rpc_ss_thread_handle_t thread_handle ) { rpc_ss_thread_indirection_t *helper_thread_indirection_ptr; /* If a context exists, destroy it */ RPC_SS_THREADS_KEY_GET_CONTEXT( rpc_ss_thread_supp_key, &helper_thread_indirection_ptr ); if ( helper_thread_indirection_ptr != NULL ) { free( helper_thread_indirection_ptr ); } /* Now create the new context */ helper_thread_indirection_ptr = (rpc_ss_thread_indirection_t *) malloc(sizeof(rpc_ss_thread_indirection_t)); if (helper_thread_indirection_ptr == NULL) { DCETHREAD_RAISE( rpc_x_no_memory ); } helper_thread_indirection_ptr->indirection = (rpc_ss_thread_support_ptrs_t *)thread_handle; helper_thread_indirection_ptr->free_referents = idl_false; RPC_SS_THREADS_KEY_SET_CONTEXT( rpc_ss_thread_supp_key, helper_thread_indirection_ptr ); }
static void rpc_ss_client_get_thread_ctx ( rpc_ss_thread_support_ptrs_t **p_p_support_ptrs ) { rpc_ss_thread_support_ptrs_t *p_support_ptrs; rpc_ss_thread_indirection_t *thread_indirection_ptr; #ifndef MEMORY_NOT_WRITTEN_SERIALLY if ( ! rpc_ss_allocate_is_set_up ) #endif rpc_ss_init_allocate_once(); p_support_ptrs = (rpc_ss_thread_support_ptrs_t *)rpc_ss_get_thread_handle(); if (p_support_ptrs == NULL) { /* We have no context. Make one with the fields we need */ p_support_ptrs = (rpc_ss_thread_support_ptrs_t *) malloc(sizeof(rpc_ss_thread_support_ptrs_t)); if (p_support_ptrs == NULL) { DCETHREAD_RAISE( rpc_x_no_memory ); } p_support_ptrs->p_mem_h = (rpc_ss_mem_handle *) malloc(sizeof(rpc_ss_mem_handle)); if (p_support_ptrs->p_mem_h == NULL) { DCETHREAD_RAISE( rpc_x_no_memory ); } p_support_ptrs->p_mem_h->memory = NULL; p_support_ptrs->p_mem_h->node_table = NULL; RPC_SS_THREADS_MUTEX_CREATE (&(p_support_ptrs->mutex)); p_support_ptrs->p_allocate = (idl_void_p_t (*)( idl_size_t size ))rpc_ss_client_default_malloc; p_support_ptrs->p_free = (void (*)( idl_void_p_t ptr ))free; thread_indirection_ptr = (rpc_ss_thread_indirection_t *) malloc(sizeof(rpc_ss_thread_indirection_t)); if (thread_indirection_ptr == NULL) { DCETHREAD_RAISE( rpc_x_no_memory ); } thread_indirection_ptr->indirection = p_support_ptrs; thread_indirection_ptr->free_referents = idl_true; RPC_SS_THREADS_KEY_SET_CONTEXT( rpc_ss_thread_supp_key, thread_indirection_ptr ); } *p_p_support_ptrs = p_support_ptrs; }
static void rpc_ss_destroy_thread_ctx ( rpc_ss_thread_indirection_t *thread_indirection_ptr ) { rpc_ss_thread_support_ptrs_t *p_thread_support_ptrs; if (thread_indirection_ptr != NULL) { if (thread_indirection_ptr->free_referents) { p_thread_support_ptrs = thread_indirection_ptr->indirection; /* Release any memory owned by the memory handle */ rpc_ss_mem_free( p_thread_support_ptrs->p_mem_h ); /* * Free the objects it points at. * Must cast because instance_of * (rpc_ss_thread_support_ptrs_t).p_mem_h * is of type rpc_mem_handle, which is a pointer to volatile, * and free() doesn't take a pointer to volatile. */ free( (idl_void_p_t)p_thread_support_ptrs->p_mem_h ); RPC_SS_THREADS_MUTEX_DELETE( &(p_thread_support_ptrs->mutex) ); /* Free the structure */ free( p_thread_support_ptrs ); } /* Free the indirection storage */ free( thread_indirection_ptr ); /* And destroy the context - this is required for Kernel RPC */ RPC_SS_THREADS_KEY_SET_CONTEXT( rpc_ss_thread_supp_key, NULL ); } }