[Xenomai-git] Ronny meeus : psos: fix memory leak with message buffers

2011-01-25 Thread GIT version control
Module: xenomai-head
Branch: master
Commit: 5cfb204fc10bd91d9a55c92ba7b129423145cad3
URL:
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=5cfb204fc10bd91d9a55c92ba7b129423145cad3

Author: Ronny meeus 
Date:   Tue Jan 18 17:57:18 2011 +0100

psos: fix memory leak with message buffers

---

 ksrc/skins/psos+/queue.c |   56 -
 1 files changed, 25 insertions(+), 31 deletions(-)

diff --git a/ksrc/skins/psos+/queue.c b/ksrc/skins/psos+/queue.c
index 703ca3b..d531046 100644
--- a/ksrc/skins/psos+/queue.c
+++ b/ksrc/skins/psos+/queue.c
@@ -40,6 +40,7 @@ static int msgq_read_proc(char *page,
int len;
spl_t s;
 
+   p += sprintf(p, "psosmbufq #bufs=%d\n",countq(&psosmbufq));
p += sprintf(p, "maxnum=%lu:maxlen=%lu:mcount=%d\n",
 queue->maxnum, queue->maxlen, countq(&queue->inq));
 
@@ -164,15 +165,20 @@ static psosmbuf_t *get_mbuf(psosqueue_t *queue, u_long 
msglen)
if (mbuf)
inith(&mbuf->link);
} else {
-   xnholder_t *holder = getq(&queue->freeq);
-
-   if (!holder &&
-   testbits(queue->synchbase.status, Q_INFINITE) &&
-   feed_pool(&queue->chunkq,
- &queue->freeq, PSOS_QUEUE_MIN_ALLOC,
- queue->maxlen) != 0)
+   xnholder_t *holder = NULL;
+   if (testbits(queue->synchbase.status, Q_SHAREDINIT)) {
+   holder = getq(&psosmbufq);
+   if (!holder) {
+   feed_pool(&psoschunkq, 
&psosmbufq,PSOS_QUEUE_MIN_ALLOC,queue->maxlen);
+   holder = getq(&psosmbufq);
+   }
+   } else {
holder = getq(&queue->freeq);
-
+   if (!holder && testbits(queue->synchbase.status, 
Q_INFINITE)) { 
+   feed_pool(&queue->chunkq,&queue->freeq, 
PSOS_QUEUE_MIN_ALLOC,queue->maxlen);
+   holder = getq(&queue->freeq);
+   }
+   }
if (holder)
mbuf = link2psosmbuf(holder);
}
@@ -187,7 +193,6 @@ static u_long q_create_internal(const char *name,
static unsigned long msgq_ids;
psosqueue_t *queue;
int bflags, ret;
-   u_long rc;
spl_t s;
 
bflags = (flags & Q_VARIABLE);
@@ -236,27 +241,13 @@ static u_long q_create_internal(const char *name,
initq(&queue->chunkq);
 
if (bflags & Q_PRIVCACHE) {
-   if (bflags & Q_SHAREDINIT) {
-   xnlock_get_irqsave(&nklock, s);
-   rc = feed_pool(&psoschunkq, &psosmbufq, maxnum, maxlen);
-   xnlock_put_irqrestore(&nklock, s);
-   } else
-   rc = feed_pool(&queue->chunkq, &queue->freeq, maxnum,
-  maxlen);
-
-   if (!rc) {
-   /* Can't preallocate msg buffers. */
-   xnfree(queue);
-   return ERR_NOMGB;
-   }
-
-   if (bflags & Q_SHAREDINIT) {
-   xnlock_get_irqsave(&nklock, s);
-
-   while (countq(&queue->freeq) < maxnum)
-   appendq(&queue->freeq, getq(&psosmbufq));
-
-   xnlock_put_irqrestore(&nklock, s);
+   if ((bflags & Q_SHAREDINIT) == 0) {
+   u_long rc = feed_pool(&queue->chunkq, &queue->freeq, 
maxnum, maxlen);
+   if (!rc) {
+   /* Can't preallocate msg buffers. */
+   xnfree(queue);
+   return ERR_NOMGB;
+   }
}
}
 
@@ -477,7 +468,10 @@ static u_long q_receive_internal(u_long qid,
 
if (testbits(queue->synchbase.status, Q_NOCACHE))
xnfree(mbuf);
-   else
+   else if (testbits(queue->synchbase.status, Q_SHAREDINIT)) {
+   /* Message buffer should go to the psosmbufq */
+   appendq(&psosmbufq, &mbuf->link);
+   } else
appendq(&queue->freeq, &mbuf->link);
 
   unlock_and_exit:


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Ronny meeus : psos: fix memory leak with message buffers

2011-01-22 Thread GIT version control
Module: xenomai-2.5
Branch: master
Commit: 5cfb204fc10bd91d9a55c92ba7b129423145cad3
URL:
http://git.xenomai.org/?p=xenomai-2.5.git;a=commit;h=5cfb204fc10bd91d9a55c92ba7b129423145cad3

Author: Ronny meeus 
Date:   Tue Jan 18 17:57:18 2011 +0100

psos: fix memory leak with message buffers

---

 ksrc/skins/psos+/queue.c |   56 -
 1 files changed, 25 insertions(+), 31 deletions(-)

diff --git a/ksrc/skins/psos+/queue.c b/ksrc/skins/psos+/queue.c
index 703ca3b..d531046 100644
--- a/ksrc/skins/psos+/queue.c
+++ b/ksrc/skins/psos+/queue.c
@@ -40,6 +40,7 @@ static int msgq_read_proc(char *page,
int len;
spl_t s;
 
+   p += sprintf(p, "psosmbufq #bufs=%d\n",countq(&psosmbufq));
p += sprintf(p, "maxnum=%lu:maxlen=%lu:mcount=%d\n",
 queue->maxnum, queue->maxlen, countq(&queue->inq));
 
@@ -164,15 +165,20 @@ static psosmbuf_t *get_mbuf(psosqueue_t *queue, u_long 
msglen)
if (mbuf)
inith(&mbuf->link);
} else {
-   xnholder_t *holder = getq(&queue->freeq);
-
-   if (!holder &&
-   testbits(queue->synchbase.status, Q_INFINITE) &&
-   feed_pool(&queue->chunkq,
- &queue->freeq, PSOS_QUEUE_MIN_ALLOC,
- queue->maxlen) != 0)
+   xnholder_t *holder = NULL;
+   if (testbits(queue->synchbase.status, Q_SHAREDINIT)) {
+   holder = getq(&psosmbufq);
+   if (!holder) {
+   feed_pool(&psoschunkq, 
&psosmbufq,PSOS_QUEUE_MIN_ALLOC,queue->maxlen);
+   holder = getq(&psosmbufq);
+   }
+   } else {
holder = getq(&queue->freeq);
-
+   if (!holder && testbits(queue->synchbase.status, 
Q_INFINITE)) { 
+   feed_pool(&queue->chunkq,&queue->freeq, 
PSOS_QUEUE_MIN_ALLOC,queue->maxlen);
+   holder = getq(&queue->freeq);
+   }
+   }
if (holder)
mbuf = link2psosmbuf(holder);
}
@@ -187,7 +193,6 @@ static u_long q_create_internal(const char *name,
static unsigned long msgq_ids;
psosqueue_t *queue;
int bflags, ret;
-   u_long rc;
spl_t s;
 
bflags = (flags & Q_VARIABLE);
@@ -236,27 +241,13 @@ static u_long q_create_internal(const char *name,
initq(&queue->chunkq);
 
if (bflags & Q_PRIVCACHE) {
-   if (bflags & Q_SHAREDINIT) {
-   xnlock_get_irqsave(&nklock, s);
-   rc = feed_pool(&psoschunkq, &psosmbufq, maxnum, maxlen);
-   xnlock_put_irqrestore(&nklock, s);
-   } else
-   rc = feed_pool(&queue->chunkq, &queue->freeq, maxnum,
-  maxlen);
-
-   if (!rc) {
-   /* Can't preallocate msg buffers. */
-   xnfree(queue);
-   return ERR_NOMGB;
-   }
-
-   if (bflags & Q_SHAREDINIT) {
-   xnlock_get_irqsave(&nklock, s);
-
-   while (countq(&queue->freeq) < maxnum)
-   appendq(&queue->freeq, getq(&psosmbufq));
-
-   xnlock_put_irqrestore(&nklock, s);
+   if ((bflags & Q_SHAREDINIT) == 0) {
+   u_long rc = feed_pool(&queue->chunkq, &queue->freeq, 
maxnum, maxlen);
+   if (!rc) {
+   /* Can't preallocate msg buffers. */
+   xnfree(queue);
+   return ERR_NOMGB;
+   }
}
}
 
@@ -477,7 +468,10 @@ static u_long q_receive_internal(u_long qid,
 
if (testbits(queue->synchbase.status, Q_NOCACHE))
xnfree(mbuf);
-   else
+   else if (testbits(queue->synchbase.status, Q_SHAREDINIT)) {
+   /* Message buffer should go to the psosmbufq */
+   appendq(&psosmbufq, &mbuf->link);
+   } else
appendq(&queue->freeq, &mbuf->link);
 
   unlock_and_exit:


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Ronny meeus : psos: fix memory leak with message buffers

2011-01-18 Thread GIT version control
Module: xenomai-rpm
Branch: for-upstream
Commit: 5cfb204fc10bd91d9a55c92ba7b129423145cad3
URL:
http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=5cfb204fc10bd91d9a55c92ba7b129423145cad3

Author: Ronny meeus 
Date:   Tue Jan 18 17:57:18 2011 +0100

psos: fix memory leak with message buffers

---

 ksrc/skins/psos+/queue.c |   56 -
 1 files changed, 25 insertions(+), 31 deletions(-)

diff --git a/ksrc/skins/psos+/queue.c b/ksrc/skins/psos+/queue.c
index 703ca3b..d531046 100644
--- a/ksrc/skins/psos+/queue.c
+++ b/ksrc/skins/psos+/queue.c
@@ -40,6 +40,7 @@ static int msgq_read_proc(char *page,
int len;
spl_t s;
 
+   p += sprintf(p, "psosmbufq #bufs=%d\n",countq(&psosmbufq));
p += sprintf(p, "maxnum=%lu:maxlen=%lu:mcount=%d\n",
 queue->maxnum, queue->maxlen, countq(&queue->inq));
 
@@ -164,15 +165,20 @@ static psosmbuf_t *get_mbuf(psosqueue_t *queue, u_long 
msglen)
if (mbuf)
inith(&mbuf->link);
} else {
-   xnholder_t *holder = getq(&queue->freeq);
-
-   if (!holder &&
-   testbits(queue->synchbase.status, Q_INFINITE) &&
-   feed_pool(&queue->chunkq,
- &queue->freeq, PSOS_QUEUE_MIN_ALLOC,
- queue->maxlen) != 0)
+   xnholder_t *holder = NULL;
+   if (testbits(queue->synchbase.status, Q_SHAREDINIT)) {
+   holder = getq(&psosmbufq);
+   if (!holder) {
+   feed_pool(&psoschunkq, 
&psosmbufq,PSOS_QUEUE_MIN_ALLOC,queue->maxlen);
+   holder = getq(&psosmbufq);
+   }
+   } else {
holder = getq(&queue->freeq);
-
+   if (!holder && testbits(queue->synchbase.status, 
Q_INFINITE)) { 
+   feed_pool(&queue->chunkq,&queue->freeq, 
PSOS_QUEUE_MIN_ALLOC,queue->maxlen);
+   holder = getq(&queue->freeq);
+   }
+   }
if (holder)
mbuf = link2psosmbuf(holder);
}
@@ -187,7 +193,6 @@ static u_long q_create_internal(const char *name,
static unsigned long msgq_ids;
psosqueue_t *queue;
int bflags, ret;
-   u_long rc;
spl_t s;
 
bflags = (flags & Q_VARIABLE);
@@ -236,27 +241,13 @@ static u_long q_create_internal(const char *name,
initq(&queue->chunkq);
 
if (bflags & Q_PRIVCACHE) {
-   if (bflags & Q_SHAREDINIT) {
-   xnlock_get_irqsave(&nklock, s);
-   rc = feed_pool(&psoschunkq, &psosmbufq, maxnum, maxlen);
-   xnlock_put_irqrestore(&nklock, s);
-   } else
-   rc = feed_pool(&queue->chunkq, &queue->freeq, maxnum,
-  maxlen);
-
-   if (!rc) {
-   /* Can't preallocate msg buffers. */
-   xnfree(queue);
-   return ERR_NOMGB;
-   }
-
-   if (bflags & Q_SHAREDINIT) {
-   xnlock_get_irqsave(&nklock, s);
-
-   while (countq(&queue->freeq) < maxnum)
-   appendq(&queue->freeq, getq(&psosmbufq));
-
-   xnlock_put_irqrestore(&nklock, s);
+   if ((bflags & Q_SHAREDINIT) == 0) {
+   u_long rc = feed_pool(&queue->chunkq, &queue->freeq, 
maxnum, maxlen);
+   if (!rc) {
+   /* Can't preallocate msg buffers. */
+   xnfree(queue);
+   return ERR_NOMGB;
+   }
}
}
 
@@ -477,7 +468,10 @@ static u_long q_receive_internal(u_long qid,
 
if (testbits(queue->synchbase.status, Q_NOCACHE))
xnfree(mbuf);
-   else
+   else if (testbits(queue->synchbase.status, Q_SHAREDINIT)) {
+   /* Message buffer should go to the psosmbufq */
+   appendq(&psosmbufq, &mbuf->link);
+   } else
appendq(&queue->freeq, &mbuf->link);
 
   unlock_and_exit:


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git