Philippe Gerum wrote:
> On Thu, 2007-05-10 at 16:53 +0200, Gilles Chanteperdrix wrote:
>
>>Philippe Gerum wrote:
>>
>>>On Thu, 2007-05-10 at 11:33 +0200, Gilles Chanteperdrix wrote:
>>>
>>>
>>>>Philippe Gerum wrote:
>>>>
>>>>>xnfreesafe was meant to prevent the caller from releasing some memory it
>>>>>could still rely on, e.g. stack space, by postponing the actual release
>>>>>until the idle thread is resumed. In your case, the problem is that it
>>>>>does not account for the primary/secondary mode of a shadow thread.
>>>>
>>>>I am not so sure. I mean, even if the thread was deleted from the
>>>>context of another thread, the two hooks would be invoked and we would
>>>>need the free operation to be deferred until after the execution of the
>>>>second hook.
>>>>
>>>
>>>
>>>The point is that deletion hooks are always called on behalf of the
>>>exiting thread in secondary mode, so if xnfreesafe properly identifies
>>>the caller as the current thread - regardless of its exec mode - then
>>>the deferral should always take place. But I agree on the fact that we
>>>should always end up running the deferred call in this context anyway,
>>>so we would be better off calling xnheap_schedule_free() directly.
>>
>>That is why, since xnfreesafe was only called in this precise context, I
>>redefined it to call xnheap_schedule_free directly.
>>
>
>
> Well, ok. But we may need the xnfreesafe() interface in the future, the
> way it was designed initially, I mean. So let's call
> xnheap_schedule_free directly when needed.
>
Hence the final patch:
--
Gilles Chanteperdrix
Index: v2.3.x/include/nucleus/heap.h
===================================================================
--- v2.3.x/include/nucleus/heap.h (révision 2429)
+++ v2.3.x/include/nucleus/heap.h (copie de travail)
@@ -120,7 +120,7 @@
#define xnfreesync() xnheap_finalize_free(&kheap)
#define xnfreesafe(thread,ptr,ln) \
do { \
- if (xnpod_current_thread() == thread) \
+ if (xnpod_current_p(thread)) \
xnheap_schedule_free(&kheap,ptr,ln); \
else \
xnheap_free(&kheap,ptr); \
Index: v2.3.x/include/nucleus/pod.h
===================================================================
--- v2.3.x/include/nucleus/pod.h (révision 2429)
+++ v2.3.x/include/nucleus/pod.h (copie de travail)
@@ -297,8 +297,16 @@
#define xnpod_current_root() \
(&xnpod_current_sched()->rootcb)
+#ifdef CONFIG_XENO_OPT_PERVASIVE
+#define xnpod_current_p(thread) \
+ ({ int __shadow_p = xnthread_test_state(thread, XNSHADOW); \
+ int __curr_p = __shadow_p ? xnshadow_thread(current) == thread \
+ : thread == xnpod_current_thread(); \
+ __curr_p;})
+#else
#define xnpod_current_p(thread) \
(xnpod_current_thread() == (thread))
+#endif
#define xnpod_locked_p() \
(!!xnthread_test_state(xnpod_current_thread(),XNLOCK))
Index: v2.3.x/ksrc/skins/psos+/task.c
===================================================================
--- v2.3.x/ksrc/skins/psos+/task.c (révision 2429)
+++ v2.3.x/ksrc/skins/psos+/task.c (copie de travail)
@@ -52,7 +52,7 @@
xnarch_delete_display(&task->threadbase);
psos_mark_deleted(task);
- xnfreesafe(&task->threadbase, task, &task->link);
+ xnheap_schedule_free(&kheap, task, &task->link);
}
void psostask_init(u_long rrperiod)
Index: v2.3.x/ksrc/skins/rtai/task.c
===================================================================
--- v2.3.x/ksrc/skins/rtai/task.c (révision 2429)
+++ v2.3.x/ksrc/skins/rtai/task.c (copie de travail)
@@ -40,7 +40,7 @@
rtai_mark_deleted(task);
if (xnthread_test_state(&task->thread_base, XNSHADOW))
- xnfreesafe(&task->thread_base, task, &task->link);
+ xnheap_schedule_free(&kheap, task, &task->link);
}
static void __task_switch_hook(xnthread_t *thread)
Index: v2.3.x/ksrc/skins/posix/thread.c
===================================================================
--- v2.3.x/ksrc/skins/posix/thread.c (révision 2429)
+++ v2.3.x/ksrc/skins/posix/thread.c (copie de travail)
@@ -45,7 +45,7 @@
called from pse51_thread_pkg_cleanup, hence the absence of
xnpod_schedule(). */
xnsynch_destroy(&thread->join_synch);
- xnfree(thread);
+ xnheap_schedule_free(&kheap, thread, &thread->link);
}
static void thread_trampoline(void *cookie)
Index: v2.3.x/ksrc/skins/vrtx/task.c
===================================================================
--- v2.3.x/ksrc/skins/vrtx/task.c (révision 2429)
+++ v2.3.x/ksrc/skins/vrtx/task.c (copie de travail)
@@ -46,7 +46,7 @@
vrtx_mark_deleted(task);
- xnfreesafe(&task->threadbase, task, &task->link);
+ xnheap_schedule_free(&kheap, task, &task->link);
}
int vrtxtask_init(u_long stacksize)
Index: v2.3.x/ksrc/skins/vxworks/taskLib.c
===================================================================
--- v2.3.x/ksrc/skins/vxworks/taskLib.c (révision 2429)
+++ v2.3.x/ksrc/skins/vxworks/taskLib.c (copie de travail)
@@ -605,7 +605,7 @@
wind_mark_deleted(task);
if (task->auto_delete)
- xnfreesafe(&task->threadbase, task, &task->link);
+ xnheap_schedule_free(&kheap, task, &task->link);
}
static void wind_task_trampoline(void *cookie)
Index: v2.3.x/ksrc/skins/native/task.c
===================================================================
--- v2.3.x/ksrc/skins/native/task.c (révision 2429)
+++ v2.3.x/ksrc/skins/native/task.c (copie de travail)
@@ -76,7 +76,7 @@
xeno_mark_deleted(task);
if (xnthread_test_state(&task->thread_base, XNSHADOW))
- xnfreesafe(&task->thread_base, task, &task->link);
+ xnheap_schedule_free(&kheap, task, &task->link);
}
void __native_task_safe(RT_TASK *task)
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help