mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 18:59:33 +03:00
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);
|
||||
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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user