Enhanse the thread interface to do something quasi inteligent

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
This commit is contained in:
behlendo 2008-05-12 18:54:08 +00:00
parent 8464443f8d
commit a97df54e83
2 changed files with 24 additions and 3 deletions

View File

@ -78,7 +78,7 @@ __spl_mutex_init(kmutex_t *mp, char *name, int type, void *ibc)
} }
sema_init(mp->km_sem, 1); sema_init(mp->km_sem, 1);
strcpy(mp->km_name, name); strncpy(mp->km_name, name, mp->km_name_size);
#ifdef DEBUG_MUTEX #ifdef DEBUG_MUTEX
mp->km_stats = kmem_zalloc(sizeof(int) * MUTEX_STATS_SIZE, flags); mp->km_stats = kmem_zalloc(sizeof(int) * MUTEX_STATS_SIZE, flags);

View File

@ -12,6 +12,8 @@
*/ */
typedef struct thread_priv_s { typedef struct thread_priv_s {
unsigned long tp_magic; /* Magic */ 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_func)(void *); /* Registered function */
void *tp_args; /* Args to be passed to function */ void *tp_args; /* Args to be passed to function */
size_t tp_len; /* Len 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; args = tp->tp_args;
set_current_state(tp->tp_state); set_current_state(tp->tp_state);
set_user_nice((kthread_t *)get_current(), PRIO_TO_NICE(tp->tp_pri)); 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) if (func)
func(args); func(args);
@ -60,6 +63,7 @@ __thread_create(caddr_t stk, size_t stksize, thread_func_t func,
thread_priv_t *tp; thread_priv_t *tp;
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
struct task_struct *tsk; struct task_struct *tsk;
char *p;
ENTRY; ENTRY;
/* Option pp is simply ignored */ /* Option pp is simply ignored */
@ -71,13 +75,30 @@ __thread_create(caddr_t stk, size_t stksize, thread_func_t func,
RETURN(NULL); RETURN(NULL);
tp->tp_magic = TP_MAGIC; 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_func = func;
tp->tp_args = args; tp->tp_args = args;
tp->tp_len = len; tp->tp_len = len;
tp->tp_state = state; tp->tp_state = state;
tp->tp_pri = pri; 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)) { if (IS_ERR(tsk)) {
CERROR("Failed to create thread: %ld\n", PTR_ERR(tsk)); CERROR("Failed to create thread: %ld\n", PTR_ERR(tsk));
RETURN(NULL); RETURN(NULL);