]> granicus.if.org Git - spl/commitdiff
Enhanse the thread interface to do something quasi inteligent
authorbehlendo <behlendo@7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c>
Mon, 12 May 2008 18:54:08 +0000 (18:54 +0000)
committerbehlendo <behlendo@7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c>
Mon, 12 May 2008 18:54:08 +0000 (18:54 +0000)
with the function name passed to be used as a thread name.  Leaving
the trailing _thread is just redundant so just strip it this
make the thread names far more readable.

Use a strncpy in spl-mutex  just to be safe.

git-svn-id: https://outreach.scidac.gov/svn/spl/trunk@107 7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c

modules/spl/spl-mutex.c
modules/spl/spl-thread.c

index d9f3c0759a40a7709ee77fc1c032bccf3d7e2e6c..8ca1286e96e9743d1f88ffecb9a860ae654a0707 100644 (file)
@@ -78,7 +78,7 @@ __spl_mutex_init(kmutex_t *mp, char *name, int type, void *ibc)
        }
 
        sema_init(mp->km_sem, 1);
-       strcpy(mp->km_name, name);
+       strncpy(mp->km_name, name, mp->km_name_size);
 
 #ifdef DEBUG_MUTEX
        mp->km_stats = kmem_zalloc(sizeof(int) * MUTEX_STATS_SIZE, flags);
index e073bb2b601f6d1ed8835e3f5654abd22302e0a5..de4f0389851a07e63744e49e5f4546e61b1a8aad 100644 (file)
@@ -12,6 +12,8 @@
  */
 typedef struct thread_priv_s {
        unsigned long tp_magic;         /* Magic */
+        int tp_name_size;              /* Name size */
+        char *tp_name;                 /* Name (without _thread suffix) */
        void (*tp_func)(void *);        /* Registered function */
        void *tp_args;                  /* Args to be passed to function */
        size_t tp_len;                  /* Len to be passed to function */
@@ -31,7 +33,8 @@ thread_generic_wrapper(void *arg)
        args = tp->tp_args;
        set_current_state(tp->tp_state);
        set_user_nice((kthread_t *)get_current(), PRIO_TO_NICE(tp->tp_pri));
-       kmem_free(arg, sizeof(thread_priv_t));
+       kmem_free(tp->tp_name, tp->tp_name_size);
+       kmem_free(tp, sizeof(thread_priv_t));
 
        if (func)
                func(args);
@@ -60,6 +63,7 @@ __thread_create(caddr_t stk, size_t  stksize, thread_func_t func,
        thread_priv_t *tp;
        DEFINE_WAIT(wait);
        struct task_struct *tsk;
+       char *p;
        ENTRY;
 
        /* Option pp is simply ignored */
@@ -71,13 +75,30 @@ __thread_create(caddr_t stk, size_t  stksize, thread_func_t func,
                RETURN(NULL);
 
        tp->tp_magic = TP_MAGIC;
+       tp->tp_name_size = strlen(name) + 1;
+
+       tp->tp_name = kmem_alloc(tp->tp_name_size, KM_SLEEP);
+        if (tp->tp_name == NULL) {
+               kmem_free(tp, sizeof(thread_priv_t));
+               RETURN(NULL);
+       }
+
+       strncpy(tp->tp_name, name, tp->tp_name_size);
+
+       /* Strip trailing "_thread" from passed name which will be the func
+        * name since the exposed API has no parameter for passing a name.
+        */
+       p = strstr(tp->tp_name, "_thread");
+       if (p)
+               p[0] = '\0';
+
        tp->tp_func  = func;
        tp->tp_args  = args;
        tp->tp_len   = len;
        tp->tp_state = state;
        tp->tp_pri   = pri;
 
-       tsk = kthread_create(thread_generic_wrapper, (void *)tp, "%s", name);
+       tsk = kthread_create(thread_generic_wrapper, (void *)tp, tp->tp_name);
        if (IS_ERR(tsk)) {
                CERROR("Failed to create thread: %ld\n", PTR_ERR(tsk));
                RETURN(NULL);