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:
parent
8464443f8d
commit
a97df54e83
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue