Niklaus Giger wrote: > Hi > > Thanks a lot to Philippe for fixing the previous bug so quickly! Never got > fixed a bug as fast by WindRIver despite having paid quite a lot of money > for it! >
inertia = success / competition > Now my testsuite passes almost all tests but crashes, when it spawns > twice a task with the same name. E.g. I get the following output: >> testTask done t1 0x901a0f4 t2 0x901a2b4 >> Xenomai/SOLO: duplicate task name: Test >> assert passed at task1 line 24 >> assert passed at task1 line 24 >> assert passed at task1 line 26 >> assert passed at task1 line 26 >> >> Command terminated by signal 11 > > Attached my simple test case. > I eventually found out that this problem was triggered by the registry support, in case duplicate names where found. This patch should fix the issue: diff --git a/base/registry.c b/base/registry.c index 6ab7461..d0ada62 100644 --- a/base/registry.c +++ b/base/registry.c @@ -116,11 +116,28 @@ done: return ret; } -int registry_add_file(struct fsobj *fsobj, struct registry_operations *ops, - int mode, const char *fmt, ...) +int registry_init_file(struct fsobj *fsobj, struct registry_operations *ops) { - char path[PATH_MAX], *basename, *dir; pthread_mutexattr_t mattr; + + if (__no_registry_arg) + return 0; + + fsobj->path = NULL; + fsobj->ops = ops; + holder_init(&fsobj->link); + + pthread_mutexattr_init(&mattr); + pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT); + pthread_mutex_init(&fsobj->lock, &mattr); + pthread_mutexattr_destroy(&mattr); + + return 0; +} + +int registry_add_file(struct fsobj *fsobj, int mode, const char *fmt, ...) +{ + char path[PATH_MAX], *basename, *dir; struct hashobj *hobj; struct regfs_dir *d; va_list ap; @@ -139,16 +156,9 @@ int registry_add_file(struct fsobj *fsobj, struct registry_operations *ops, fsobj->path = xnstrdup(path); fsobj->basename = fsobj->path + (basename - path) + 1; - fsobj->ops = ops; fsobj->mode = mode & O_ACCMODE; clock_gettime(CLOCK_REALTIME, &fsobj->ctime); fsobj->mtime = fsobj->ctime; - holder_init(&fsobj->link); - - pthread_mutexattr_init(&mattr); - pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT); - pthread_mutex_init(&fsobj->lock, &mattr); - pthread_mutexattr_destroy(&mattr); pthread_mutex_lock(®fs_lock); @@ -161,7 +171,9 @@ int registry_add_file(struct fsobj *fsobj, struct registry_operations *ops, hobj = hash_search(®fs_dirtable, dir); if (hobj == NULL) { fail: + hash_remove(®fs_objtable, &fsobj->hobj); xnfree(path); + fsobj->path = NULL; ret = -ENOENT; goto done; } @@ -184,6 +196,10 @@ void registry_remove_file(struct fsobj *fsobj) return; pthread_mutex_lock(®fs_lock); + + if (fsobj->path == NULL) + goto out; /* Not registered. */ + hash_remove(®fs_objtable, &fsobj->hobj); pthread_mutex_lock(&fsobj->lock); @@ -194,7 +210,7 @@ void registry_remove_file(struct fsobj *fsobj) xnfree(fsobj->path); pthread_mutex_unlock(&fsobj->lock); pthread_mutex_destroy(&fsobj->lock); - +out: pthread_mutex_unlock(®fs_lock); } diff --git a/include/xenomai/registry.h b/include/xenomai/registry.h index 15b98a3..e7f6247 100644 --- a/include/xenomai/registry.h +++ b/include/xenomai/registry.h @@ -57,8 +57,10 @@ extern "C" { int registry_add_dir(const char *fmt, ...); +int registry_init_file(struct fsobj *fsobj, + struct registry_operations *ops); + int registry_add_file(struct fsobj *fsobj, - struct registry_operations *ops, int mode, const char *fmt, ...); @@ -89,8 +91,14 @@ int registry_add_dir(const char *fmt, ...) } static inline +int registry_init_file(struct fsobj *fsobj, + struct registry_operations *ops) +{ + return 0; +} + +static inline int registry_add_file(struct fsobj *fsobj, - struct registry_operations *ops, int mode, const char *fmt, ...) { diff --git a/vxworks/taskLib.c b/vxworks/taskLib.c index 8c1e612..f6253b2 100644 --- a/vxworks/taskLib.c +++ b/vxworks/taskLib.c @@ -234,17 +234,18 @@ static void *task_trampoline(void *arg) goto done; } + ret = registry_init_file(&task->fsobj, ®istry_ops); + if (hash_enter(&wind_task_table, task->name, &task->obj)) { warning("duplicate task name: %s", task->name); /* Make sure we won't un-hash the previous one. */ strcpy(task->name, "(dup)"); - } else { - ret = registry_add_file(&task->fsobj, ®istry_ops, O_RDONLY, + } else if (ret == 0) + ret = registry_add_file(&task->fsobj, O_RDONLY, "/vxworks/tasks/%s", task->name); - if (ret) - warning("failed to export task %s to registry", - task->name); - } + if (ret) + warning("failed to export task %s to registry", + task->name); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); -- Philippe. _______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core