* [Xenomai-core] Xenomai-Solo: bug in vxWorks taskSpawn with twice the same name
@ 2008-09-15 18:42 Niklaus Giger
2008-09-17 10:33 ` Philippe Gerum
0 siblings, 1 reply; 2+ messages in thread
From: Niklaus Giger @ 2008-09-15 18:42 UTC (permalink / raw)
To: xenomai-core
[-- Attachment #1: Type: text/plain, Size: 614 bytes --]
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!
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.
Best regards
--
NIklaus Giger
[-- Attachment #2: tst_main.cpp --]
[-- Type: text/x-c++src, Size: 2339 bytes --]
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define assert(cond) \
if (!cond) printf("assert failed at %s line %d\n", __FUNCTION__, __LINE__); \
else printf("assert passed at %s line %d\n", __FUNCTION__, __LINE__);
#if defined(__SOLO__) || defined(_WRS_VXWORKS_MAJOR)
// #include <vxWorks.h>
#include <semLib.h>
#include <taskLib.h>
#include <tickLib.h>
#include <kernelLib.h>
void testTask(long a1, long a2, long a3, long a4, long a5,
long a6, long a7, long a8, long a9, long a10);
bool finished;
extern "C" void task1(long int, long int, long int, long int, long int, long int, long int, long int, long int, long int)
{
assert(1);
taskDelay(30);
assert(2);
finished = true;
}
#endif
/**
* Main functions
*/
#if defined(PLAT_VXWORKS) || defined(_WRS_VXWORKS_MAJOR)
extern "C" int tSysMain(const char* arg)
{
const char* argv[2];
argv[0] = "undefined";
argv[1] = arg;
int argc = sizeof(argv) / sizeof(char*);
#else
int main(int argc, char *const argv[])
{
#endif
#ifdef __SOLO__
kernelInit(testTask, argc, argv);
while(!finished) { sleep(1); }
exit(0);
}
void testTask(long a1, long a2, long a3, long a4, long a5,
long a6, long a7, long a8, long a9, long a10)
{
int argc=0; char *const argv[]={0};
#endif
int t1 =taskSpawn("Test", // name of new task (stored at pStackBase)
90, // priority of new task
0, // task option word
20*1024, // size (bytes) of stack needed plus name
task1, // entry point of new task
0, // first argument
0,0,0,0,0,0,0,0,0); // unused parameters
int t2 =taskSpawn("Test", // name of new task (stored at pStackBase)
90, // priority of new task
0, // task option word
20*1024, // size (bytes) of stack needed plus name
task1, // entry point of new task
0, // first argument
0,0,0,0,0,0,0,0,0); // unused parameters
printf("%s done t1 0x%x t2 0x%x\n", __FUNCTION__, t1, t2);
while (!finished) sleep(1);
#ifdef __SOLO__
finished = true;
return;
#else
return 0;
#endif
}
// ___________________________________________________________________________
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [Xenomai-core] Xenomai-Solo: bug in vxWorks taskSpawn with twice the same name
2008-09-15 18:42 [Xenomai-core] Xenomai-Solo: bug in vxWorks taskSpawn with twice the same name Niklaus Giger
@ 2008-09-17 10:33 ` Philippe Gerum
0 siblings, 0 replies; 2+ messages in thread
From: Philippe Gerum @ 2008-09-17 10:33 UTC (permalink / raw)
To: Niklaus Giger; +Cc: xenomai-core
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.
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-09-17 10:33 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-15 18:42 [Xenomai-core] Xenomai-Solo: bug in vxWorks taskSpawn with twice the same name Niklaus Giger
2008-09-17 10:33 ` Philippe Gerum
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.