diff options
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/common-utils.c | 110 | ||||
-rw-r--r-- | libglusterfs/src/event-epoll.c | 14 | ||||
-rw-r--r-- | libglusterfs/src/glusterfs/common-utils.h | 21 | ||||
-rw-r--r-- | libglusterfs/src/libglusterfs.sym | 3 | ||||
-rw-r--r-- | libglusterfs/src/syncop.c | 16 |
5 files changed, 105 insertions, 59 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index e16bb330a44..a49c84de5e1 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -3949,19 +3949,64 @@ error_return: return ret; } +void +gf_thread_set_vname(pthread_t thread, const char *name, va_list args) +{ + char thread_name[GF_THREAD_NAME_LIMIT]; + int ret; + + /* Initialize the thread name with the prefix (not NULL terminated). */ + memcpy(thread_name, GF_THREAD_NAME_PREFIX, + sizeof(GF_THREAD_NAME_PREFIX) - 1); + + ret = vsnprintf(thread_name + sizeof(GF_THREAD_NAME_PREFIX) - 1, + sizeof(thread_name) - sizeof(GF_THREAD_NAME_PREFIX) + 1, + name, args); + if (ret < 0) { + gf_msg(THIS->name, GF_LOG_WARNING, 0, LG_MSG_PTHREAD_NAMING_FAILED, + "Failed to compose thread name ('%s')", name); + return; + } + + if (ret >= sizeof(thread_name)) { + gf_msg(THIS->name, GF_LOG_WARNING, 0, LG_MSG_PTHREAD_NAMING_FAILED, + "Thread name is too long. It has been truncated ('%s')", + thread_name); + } + +#ifdef GF_LINUX_HOST_OS + ret = pthread_setname_np(thread, thread_name); +#elif defined(__NetBSD__) + ret = pthread_setname_np(thread, thread_name, NULL); +#elif defined(__FreeBSD__) + pthread_set_name_np(thread, thread_name); + ret = 0; +#else + ret = ENOSYS; +#endif + if (ret != 0) { + gf_msg(THIS->name, GF_LOG_WARNING, ret, LG_MSG_PTHREAD_NAMING_FAILED, + "Could not set thread name: %s", thread_name); + } +} + +void +gf_thread_set_name(pthread_t thread, const char *name, ...) +{ + va_list args; + + va_start(args, name); + gf_thread_set_vname(thread, name, args); + va_end(args); +} + int -gf_thread_create(pthread_t *thread, const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg, const char *name) +gf_thread_vcreate(pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg, const char *name, + va_list args) { sigset_t set, old; int ret; - char thread_name[GF_THREAD_NAMEMAX + GF_THREAD_NAME_PREFIX_LEN] = { - 0, - }; - /* Max name on Linux is 16 and on NetBSD is 32 - * All Gluster threads have a set prefix of gluster and hence the limit - * of 9 on GF_THREAD_NAMEMAX including the null character. - */ sigemptyset(&old); sigfillset(&set); @@ -3975,20 +4020,12 @@ gf_thread_create(pthread_t *thread, const pthread_attr_t *attr, pthread_sigmask(SIG_BLOCK, &set, &old); ret = pthread_create(thread, attr, start_routine, arg); - snprintf(thread_name, sizeof(thread_name), "%s%s", GF_THREAD_NAME_PREFIX, - name); - - if (0 == ret && name) { -#ifdef GF_LINUX_HOST_OS - pthread_setname_np(*thread, thread_name); -#elif defined(__NetBSD__) - pthread_setname_np(*thread, thread_name, NULL); -#elif defined(__FreeBSD__) - pthread_set_name_np(*thread, thread_name); -#else - gf_msg(THIS->name, GF_LOG_WARNING, 0, LG_MSG_PTHREAD_NAMING_FAILED, - "Could not set thread name: %s", thread_name); -#endif + if (ret != 0) { + gf_msg(THIS->name, GF_LOG_ERROR, ret, LG_MSG_PTHREAD_FAILED, + "Thread creation failed"); + ret = -1; + } else if (name != NULL) { + gf_thread_set_vname(*thread, name, args); } pthread_sigmask(SIG_SETMASK, &old, NULL); @@ -3997,10 +4034,26 @@ gf_thread_create(pthread_t *thread, const pthread_attr_t *attr, } int +gf_thread_create(pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg, const char *name, + ...) +{ + va_list args; + int ret; + + va_start(args, name); + ret = gf_thread_vcreate(thread, attr, start_routine, arg, name, args); + va_end(args); + + return ret; +} + +int gf_thread_create_detached(pthread_t *thread, void *(*start_routine)(void *), - void *arg, const char *name) + void *arg, const char *name, ...) { pthread_attr_t attr; + va_list args; int ret = -1; ret = pthread_attr_init(&attr); @@ -4012,12 +4065,9 @@ gf_thread_create_detached(pthread_t *thread, void *(*start_routine)(void *), pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - ret = gf_thread_create(thread, &attr, start_routine, arg, name); - if (ret) { - gf_msg(THIS->name, GF_LOG_ERROR, ret, LG_MSG_PTHREAD_FAILED, - "Thread creation failed"); - ret = -1; - } + va_start(args, name); + ret = gf_thread_vcreate(thread, &attr, start_routine, arg, name, args); + va_end(args); pthread_attr_destroy(&attr); diff --git a/libglusterfs/src/event-epoll.c b/libglusterfs/src/event-epoll.c index be8b204b7a7..dbf3faf6e6d 100644 --- a/libglusterfs/src/event-epoll.c +++ b/libglusterfs/src/event-epoll.c @@ -781,9 +781,6 @@ event_dispatch_epoll(struct event_pool *event_pool) int pollercount = 0; int ret = -1; struct event_thread_data *ev_data = NULL; - char thread_name[GF_THREAD_NAMEMAX] = { - 0, - }; /* Start the configured number of pollers */ pthread_mutex_lock(&event_pool->mutex); @@ -817,10 +814,8 @@ event_dispatch_epoll(struct event_pool *event_pool) ev_data->event_pool = event_pool; ev_data->event_index = i + 1; - snprintf(thread_name, sizeof(thread_name), "epoll%03hx", - (i & 0x3ff)); ret = gf_thread_create(&t_id, NULL, event_dispatch_epoll_worker, - ev_data, thread_name); + ev_data, "epoll%03hx", i & 0x3ff); if (!ret) { event_pool->pollers[i] = t_id; @@ -883,9 +878,6 @@ event_reconfigure_threads_epoll(struct event_pool *event_pool, int value) pthread_t t_id; int oldthreadcount; struct event_thread_data *ev_data = NULL; - char thread_name[GF_THREAD_NAMEMAX] = { - 0, - }; pthread_mutex_lock(&event_pool->mutex); { @@ -925,11 +917,9 @@ event_reconfigure_threads_epoll(struct event_pool *event_pool, int value) ev_data->event_pool = event_pool; ev_data->event_index = i + 1; - snprintf(thread_name, sizeof(thread_name), "epoll%03hx", - (i & 0x3ff)); ret = gf_thread_create(&t_id, NULL, event_dispatch_epoll_worker, ev_data, - thread_name); + "epoll%03hx", i & 0x3ff); if (ret) { gf_msg("epoll", GF_LOG_WARNING, 0, LG_MSG_START_EPOLL_THREAD_FAILED, diff --git a/libglusterfs/src/glusterfs/common-utils.h b/libglusterfs/src/glusterfs/common-utils.h index 89b38e02448..f03d2c1049a 100644 --- a/libglusterfs/src/glusterfs/common-utils.h +++ b/libglusterfs/src/glusterfs/common-utils.h @@ -147,9 +147,8 @@ trap(void); /* pthread related */ /* as per the man page, thread-name should be at max 16 bytes */ /* with prefix of 'glfs_' (5), we are left with 11 more bytes */ -#define GF_THREAD_NAMEMAX 11 +#define GF_THREAD_NAME_LIMIT 16 #define GF_THREAD_NAME_PREFIX "glfs_" -#define GF_THREAD_NAME_PREFIX_LEN 5 /* * we could have initialized these as +ve values and treated @@ -950,10 +949,24 @@ gf_set_timestamp(const char *src, const char *dest); int gf_thread_create(pthread_t *thread, const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg, const char *name); + void *(*start_routine)(void *), void *arg, const char *name, + ...) __attribute__((__format__(__printf__, 5, 6))); + +int +gf_thread_vcreate(pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg, const char *name, + va_list args); int gf_thread_create_detached(pthread_t *thread, void *(*start_routine)(void *), - void *arg, const char *name); + void *arg, const char *name, ...) + __attribute__((__format__(__printf__, 4, 5))); + +void +gf_thread_set_name(pthread_t thread, const char *name, ...) + __attribute__((__format__(__printf__, 2, 3))); + +void +gf_thread_set_vname(pthread_t thread, const char *name, va_list args); gf_boolean_t gf_is_pid_running(int pid); gf_boolean_t diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym index f0a92796187..e33d5cf14fc 100644 --- a/libglusterfs/src/libglusterfs.sym +++ b/libglusterfs/src/libglusterfs.sym @@ -710,7 +710,10 @@ gf_strTrim gf_strstr gf_thread_cleanup_xint gf_thread_create +gf_thread_vcreate gf_thread_create_detached +gf_thread_set_name +gf_thread_set_vname gf_timer_call_after gf_timer_call_cancel gf_timer_registry_destroy diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index 6206d4cec7c..c05939a7915 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -695,9 +695,6 @@ syncenv_scale(struct syncenv *env) int scale = 0; int i = 0; int ret = 0; - char thread_name[GF_THREAD_NAMEMAX] = { - 0, - }; pthread_mutex_lock(&env->mutex); { @@ -717,11 +714,9 @@ syncenv_scale(struct syncenv *env) } env->proc[i].env = env; - snprintf(thread_name, sizeof(thread_name), "sproc%03hx", - (env->procs & 0x3ff)); ret = gf_thread_create(&env->proc[i].processor, NULL, syncenv_processor, &env->proc[i], - thread_name); + "sproc%03hx", env->procs & 0x3ff); if (ret) break; env->procs++; @@ -783,9 +778,6 @@ syncenv_new(size_t stacksize, int procmin, int procmax) struct syncenv *newenv = NULL; int ret = 0; int i = 0; - char thread_name[GF_THREAD_NAMEMAX] = { - 0, - }; if (!procmin || procmin < 0) procmin = SYNCENV_PROC_MIN; @@ -814,11 +806,9 @@ syncenv_new(size_t stacksize, int procmin, int procmax) for (i = 0; i < newenv->procmin; i++) { newenv->proc[i].env = newenv; - snprintf(thread_name, sizeof(thread_name), "%s%d", "sproc", - (newenv->procs)); ret = gf_thread_create(&newenv->proc[i].processor, NULL, - syncenv_processor, &newenv->proc[i], - thread_name); + syncenv_processor, &newenv->proc[i], "sproc%d", + newenv->procs); if (ret) break; newenv->procs++; |