Skip to contentSkip to conversation

Fix tiny memory leaks around rt_task_self()

PATCH In review Jan Kiszka 2 participants 3 messages Apr 11, 2008

lore
Share & tools
lore

Jan Kiszka

author
#0 lore raw

PATCH 1/1 Fix tiny memory leaks around rt_task_self()

Nothing critical, but when using rt_task_self != NULL as a hint if the caller is Xenomai-mapped or not, this stall malloc can become at least unpleasant. This is also material for stable.

Jan

---

ChangeLog +5 -0
Index: xenomai/ChangeLog
===================================================================
@@ -1,3 +1,8 @@
+2008-04-11  Jan Kiszka  <[email protected]>
+
+	* src/skins/native/task.c: Fix tiny memory leaks of the task's
+	self-reference key.
+

2008-04-10 Philippe Gerum <[email protected]>

* src/skins/*: Force minimum stack size to 32k, in order to work

src/skins/native/task.c +0 -0
Index: xenomai/src/skins/native/task.c
===================================================================
@@ -52,6 +52,11 @@ static void rt_task_sigharden(int sig)
	XENOMAI_SYSCALL1(__xn_sys_migrate, XENOMAI_XENO_DOMAIN);
}

+static void rt_task_cleanup_tskey(void *arg)
+{
+ free(pthread_getspecific(__native_tskey));
+}
+
static void *rt_task_trampoline(void *cookie)

{
	struct rt_task_iargs *iargs = (struct rt_task_iargs *)cookie;
@@ -92,8 +97,11 @@ static void *rt_task_trampoline(void *co
		err = XENOMAI_SYSCALL2(__xn_sys_barrier, &entry, &cookie);
	while (err == -EINTR);

- if (!err)
+ if (!err) {

+		pthread_cleanup_push(rt_task_cleanup_tskey, NULL);
		entry(cookie);

+ pthread_cleanup_pop(1);
+ }

fail:

@@ -294,8 +302,10 @@ RT_TASK *rt_task_self(void)

	self = (RT_TASK *)malloc(sizeof(*self));

	if (!self ||
-	    XENOMAI_SKINCALL1(__native_muxid, __native_task_self, self) != 0)
+	    XENOMAI_SKINCALL1(__native_muxid, __native_task_self, self) != 0) {
+		free(self);
		return NULL;

+ }

	pthread_setspecific(__native_tskey, self);
#1 lore raw
Quoted 3 lines · Jan Kiszka

Nothing critical, but when using rt_task_self != NULL as a hint if the caller is Xenomai-mapped or not, this stall malloc can become at least unpleasant. This is also material for stable.

This looks useless: TSD cleanup routines are automatically called upon thread termination. It is even worse: you risk a double free if you do not re-set pthread_setspecific after having called free.

Signature · 1 line
					    Gilles.
author
#2 lore raw
Quoted 8 lines · Gilles Chanteperdrix
Quoted 3 lines · Jan Kiszka

Nothing critical, but when using rt_task_self != NULL as a hint if the caller is Xenomai-mapped or not, this stall malloc can become at least unpleasant. This is also material for stable.

This looks useless: TSD cleanup routines are automatically called upon thread termination. It is even worse: you risk a double free if you do not re-set pthread_setspecific after having called free.

Ah, I missed the already existing cleanup in init.c. Then we are done with this patch:

ChangeLog +5 -0
Index: xenomai/ChangeLog
===================================================================
@@ -1,3 +1,8 @@
+2008-04-11  Jan Kiszka  <[email protected]>
+
+	* src/skins/native/task.c (rt_task_self): Fix tiny memory leak
+	when being invoked over a non-Xenomai thread.
+

2008-04-10 Philippe Gerum <[email protected]>

* src/skins/*: Force minimum stack size to 32k, in order to work

src/skins/native/task.c +0 -0
Index: xenomai/src/skins/native/task.c
===================================================================
@@ -294,8 +294,10 @@ RT_TASK *rt_task_self(void)
	self = (RT_TASK *)malloc(sizeof(*self));

	if (!self ||
-	    XENOMAI_SKINCALL1(__native_muxid, __native_task_self, self) != 0)
+	    XENOMAI_SKINCALL1(__native_muxid, __native_task_self, self) != 0) {
+		free(self);
		return NULL;

+ }

	pthread_setspecific(__native_tskey, self);