diff options
| author | Xavi Hernandez <xhernandez@redhat.com> | 2019-01-24 18:31:10 +0100 | 
|---|---|---|
| committer | Xavi Hernandez <xhernandez@redhat.com> | 2019-02-01 10:37:20 +0100 | 
| commit | 4674678951a1315975d66016fb55c49100b7819f (patch) | |
| tree | 6572b7186f06c6405badc67cd1f3dbf450c4df6d /libglusterfs | |
| parent | 6b98735956c599ea621fa560b201fb7de6c36cac (diff) | |
core: make gf_thread_create() easier to use
This patch creates a specific function to set the thread name using a
string format and a variable argument list, like printf().
This function is used to set the thread name from gf_thread_create(),
which now accepts a variable argument list to create the full name. It's
not necessary anymore to use a local array to build the name of the
thread. This is done automatically.
Change-Id: Idd8d01fd462c227359b96e98699f8c6d962dc17c
Updates: bz#1193929
Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
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++;  | 
