diff options
Diffstat (limited to 'libglusterfs/src/globals.c')
-rw-r--r-- | libglusterfs/src/globals.c | 289 |
1 files changed, 48 insertions, 241 deletions
diff --git a/libglusterfs/src/globals.c b/libglusterfs/src/globals.c index 4fec0638926..02098e6e9c7 100644 --- a/libglusterfs/src/globals.c +++ b/libglusterfs/src/globals.c @@ -99,16 +99,19 @@ const char *gf_upcall_list[GF_UPCALL_FLAGS_MAXVALUE] = { glusterfs_ctx_t *global_ctx = NULL; pthread_mutex_t global_ctx_mutex = PTHREAD_MUTEX_INITIALIZER; xlator_t global_xlator; -static pthread_key_t this_xlator_key; -static pthread_key_t synctask_key; -static pthread_key_t uuid_buf_key; -static char global_uuid_buf[GF_UUID_BUF_SIZE]; -static pthread_key_t lkowner_buf_key; -static char global_lkowner_buf[GF_LKOWNER_BUF_SIZE]; -static pthread_key_t leaseid_buf_key; static int gf_global_mem_acct_enable = 1; static pthread_once_t globals_inited = PTHREAD_ONCE_INIT; +static pthread_key_t free_key; + +static __thread xlator_t *thread_xlator = NULL; +static __thread void *thread_synctask = NULL; +static __thread void *thread_leaseid = NULL; +static __thread struct syncopctx thread_syncopctx = {}; +static __thread char thread_uuid_buf[GF_UUID_BUF_SIZE] = {}; +static __thread char thread_lkowner_buf[GF_LKOWNER_BUF_SIZE] = {}; +static __thread char thread_leaseid_buf[GF_LEASE_ID_BUF_SIZE] = {}; + int gf_global_mem_acct_enable_get(void) { @@ -122,12 +125,6 @@ gf_global_mem_acct_enable_set(int val) return 0; } -void -glusterfs_this_destroy(void *ptr) -{ - FREE(ptr); -} - static struct xlator_cbks global_cbks = { .forget = NULL, .release = NULL, @@ -212,18 +209,9 @@ struct volume_options global_xl_options[] = { static volume_opt_list_t global_xl_opt_list; -int +void glusterfs_this_init() { - int ret = 0; - ret = pthread_key_create(&this_xlator_key, glusterfs_this_destroy); - if (ret != 0) { - gf_msg("", GF_LOG_WARNING, ret, LG_MSG_PTHREAD_KEY_CREATE_FAILED, - "failed to create " - "the pthread key"); - return ret; - } - global_xlator.name = "glusterfs"; global_xlator.type = GF_GLOBAL_XLATOR_NAME; global_xlator.cbks = &global_cbks; @@ -237,301 +225,120 @@ glusterfs_this_init() global_xl_opt_list.given_opt = global_xl_options; list_add_tail(&global_xl_opt_list.list, &global_xlator.volume_options); - - return ret; } xlator_t ** __glusterfs_this_location() { - xlator_t **this_location = NULL; - int ret = 0; - - this_location = pthread_getspecific(this_xlator_key); - - if (!this_location) { - this_location = CALLOC(1, sizeof(*this_location)); - if (!this_location) - goto out; + xlator_t **this_location; - ret = pthread_setspecific(this_xlator_key, this_location); - if (ret != 0) { - FREE(this_location); - this_location = NULL; - goto out; - } - } -out: - if (this_location) { - if (!*this_location) - *this_location = &global_xlator; + this_location = &thread_xlator; + if (*this_location == NULL) { + thread_xlator = &global_xlator; } + return this_location; } xlator_t * glusterfs_this_get() { - xlator_t **this_location = NULL; - - this_location = __glusterfs_this_location(); - if (!this_location) - return &global_xlator; - - return *this_location; + return *__glusterfs_this_location(); } -int +void glusterfs_this_set(xlator_t *this) { - xlator_t **this_location = NULL; - - this_location = __glusterfs_this_location(); - if (!this_location) - return -ENOMEM; - - *this_location = this; - - return 0; + thread_xlator = this; } /* SYNCOPCTX */ -static pthread_key_t syncopctx_key; - -static void -syncopctx_key_destroy(void *ptr) -{ - struct syncopctx *opctx = ptr; - - if (opctx) { - if (opctx->groups) - GF_FREE(opctx->groups); - - GF_FREE(opctx); - } - - return; -} void * syncopctx_getctx() { - void *opctx = NULL; - - opctx = pthread_getspecific(syncopctx_key); - - return opctx; -} - -int -syncopctx_setctx(void *ctx) -{ - int ret = 0; - - ret = pthread_setspecific(syncopctx_key, ctx); - - return ret; -} - -static int -syncopctx_init(void) -{ - int ret; - - ret = pthread_key_create(&syncopctx_key, syncopctx_key_destroy); - - return ret; + return &thread_syncopctx; } /* SYNCTASK */ -int -synctask_init() -{ - int ret = 0; - - ret = pthread_key_create(&synctask_key, NULL); - - return ret; -} - void * synctask_get() { - void *synctask = NULL; - - synctask = pthread_getspecific(synctask_key); - - return synctask; + return thread_synctask; } -int +void synctask_set(void *synctask) { - int ret = 0; - - pthread_setspecific(synctask_key, synctask); - - return ret; + thread_synctask = synctask; } // UUID_BUFFER -void -glusterfs_uuid_buf_destroy(void *ptr) -{ - FREE(ptr); -} - -int -glusterfs_uuid_buf_init() -{ - int ret = 0; - - ret = pthread_key_create(&uuid_buf_key, glusterfs_uuid_buf_destroy); - return ret; -} - char * glusterfs_uuid_buf_get() { - char *buf; - int ret = 0; - - buf = pthread_getspecific(uuid_buf_key); - if (!buf) { - buf = MALLOC(GF_UUID_BUF_SIZE); - ret = pthread_setspecific(uuid_buf_key, (void *)buf); - if (ret) - buf = global_uuid_buf; - } - return buf; + return thread_uuid_buf; } /* LKOWNER_BUFFER */ -void -glusterfs_lkowner_buf_destroy(void *ptr) -{ - FREE(ptr); -} - -int -glusterfs_lkowner_buf_init() -{ - int ret = 0; - - ret = pthread_key_create(&lkowner_buf_key, glusterfs_lkowner_buf_destroy); - return ret; -} - char * glusterfs_lkowner_buf_get() { - char *buf; - int ret = 0; - - buf = pthread_getspecific(lkowner_buf_key); - if (!buf) { - buf = MALLOC(GF_LKOWNER_BUF_SIZE); - ret = pthread_setspecific(lkowner_buf_key, (void *)buf); - if (ret) - buf = global_lkowner_buf; - } - return buf; + return thread_lkowner_buf; } /* Leaseid buffer */ -void -glusterfs_leaseid_buf_destroy(void *ptr) -{ - FREE(ptr); -} - -int -glusterfs_leaseid_buf_init() -{ - int ret = 0; - - ret = pthread_key_create(&leaseid_buf_key, glusterfs_leaseid_buf_destroy); - return ret; -} char * glusterfs_leaseid_buf_get() { char *buf = NULL; - int ret = 0; - buf = pthread_getspecific(leaseid_buf_key); - if (!buf) { - buf = CALLOC(1, GF_LEASE_ID_BUF_SIZE); - ret = pthread_setspecific(leaseid_buf_key, (void *)buf); - if (ret) { - FREE(buf); - buf = NULL; - } + buf = thread_leaseid; + if (buf == NULL) { + buf = thread_leaseid_buf; + thread_leaseid = buf; } + return buf; } char * glusterfs_leaseid_exist() { - return pthread_getspecific(leaseid_buf_key); + return thread_leaseid; } static void -gf_globals_init_once() +glusterfs_cleanup(void *ptr) { - int ret = 0; - - ret = glusterfs_this_init(); - if (ret) { - gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_TRANSLATOR_INIT_FAILED, - "ERROR: glusterfs-translator init failed"); - goto out; - } - - ret = glusterfs_uuid_buf_init(); - if (ret) { - gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_UUID_BUF_INIT_FAILED, - "ERROR: glusterfs uuid buffer init failed"); - goto out; + if (thread_syncopctx.groups != NULL) { + GF_FREE(thread_syncopctx.groups); } - ret = glusterfs_lkowner_buf_init(); - if (ret) { - gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_LKOWNER_BUF_INIT_FAILED, - "ERROR: glusterfs lkowner buffer init failed"); - goto out; - } + mem_pool_thread_destructor(); +} - ret = glusterfs_leaseid_buf_init(); - if (ret) { - gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_LEASEID_BUF_INIT_FAILED, - "ERROR: glusterfs leaseid buffer init failed"); - goto out; - } +static void +gf_globals_init_once() +{ + int ret = 0; - ret = synctask_init(); - if (ret) { - gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_SYNCTASK_INIT_FAILED, - "ERROR: glusterfs synctask init failed"); - goto out; - } + glusterfs_this_init(); - ret = syncopctx_init(); - if (ret) { - gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_SYNCOPCTX_INIT_FAILED, - "ERROR: glusterfs syncopctx init failed"); - goto out; - } -out: + /* This is needed only to cleanup the potential allocation of + * thread_syncopctx.groups. */ + ret = pthread_key_create(&free_key, glusterfs_cleanup); + if (ret != 0) { + gf_msg("", GF_LOG_ERROR, ret, LG_MSG_PTHREAD_KEY_CREATE_FAILED, + "failed to create the pthread key"); - if (ret) { gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_GLOBAL_INIT_FAILED, "Exiting as global initialization failed"); + exit(ret); } } |