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

Reply via email to