[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch
From: |
Vadim G Melihow |
Subject: |
[lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch |
Date: |
Wed, 28 May 2008 11:08:24 +0000 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.1.4) Gecko/20060911 SUSE/2.0.0.4-1.2 Firefox/2.0.0.4 |
URL:
<http://savannah.nongnu.org/bugs/?23408>
Summary: Deadlock on sys_mbox_post sys_mbox_fetch
Project: lwIP - A Lightweight TCP/IP stack
Submitted by: onlyslon
Submitted on: Среда 28.05.2008 at 11:08
Category: Contrib
Severity: 3 - Normal
Item Group: Faulty Behaviour
Status: None
Privacy: Public
Assigned to: None
Open/Closed: Open
Discussion Lock: Any
Planned Release:
_______________________________________________________
Details:
Hello..
On small values of SYS_MBOX_SIZE (40 and less)
mbox reader and writer threads stops on sys_arch_sem_wait(mbox->mail, 0);
Solution for this bug is separate semaphores.
First one - for busy
Second - for empty event
Like this...
struct sys_mbox {
int first, last;
void *msgs[SYS_MBOX_SIZE];
struct sys_sem *mutex;
int wait_send;
int mbox_size;
struct sys_sem *can_post_mail;
struct sys_sem *can_fetch_mail;
};
sys_mbox_post(struct sys_mbox *mbox, void *msg)
{
u8_t first;
sys_sem_wait(mbox->mutex);
LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_post: mbox %p msg %p\n", (void *)mbox,
(void *)msg));
while ((mbox->last + 1) >= (mbox->first + SYS_MBOX_SIZE)) {
mbox->wait_send++;
sys_sem_signal(mbox->mutex);
- sys_arch_sem_wait(mbox->mail, 0);
+ sys_arch_sem_wait(mbox->can_post_mail, 0);
sys_arch_sem_wait(mbox->mutex, 0);
mbox->wait_send--;
}
mbox->msgs[mbox->last % SYS_MBOX_SIZE] = msg;
if (mbox->last == mbox->first) {
first = 1;
} else {
first = 0;
}
mbox->last++;
if (first) {
- sys_sem_signal(mbox->mail)
+ sys_sem_signal(mbox->can_fetch_mail);
}
sys_sem_signal(mbox->mutex);
}
u32_t
sys_arch_mbox_fetch(struct sys_mbox *mbox, void **msg, u32_t timeout)
{
u32_t time = 0;
/* The mutex lock is quick so we don't bother with the timeout
stuff here. */
sys_arch_sem_wait(mbox->mutex, 0);
while (mbox->first == mbox->last) {
sys_sem_signal(mbox->mutex);
/* We block while waiting for a mail to arrive in the mailbox. We
must be prepared to timeout. */
if (timeout != 0) {
- time = sys_arch_sem_wait(mbox->mail, timeout);
+ time = sys_arch_sem_wait(mbox->can_fetch_mail, timeout);
if (time == SYS_ARCH_TIMEOUT) {
return SYS_ARCH_TIMEOUT;
}
} else {
sys_arch_sem_wait(mbox->mail, 0);
sys_arch_sem_wait(mbox->can_fetch_mail, 0);
}
sys_arch_sem_wait(mbox->mutex, 0);
}
if (msg != NULL) {
LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_fetch: mbox %p msg %p\n", (void *)mbox,
*msg));
*msg = mbox->msgs[mbox->first % SYS_MBOX_SIZE];
}
else{
LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_fetch: mbox %p, null msg\n", (void
*)mbox));
}
mbox->first++;
if (mbox->wait_send) {
- sys_sem_signal(mbox->mail);
+ sys_sem_signal(mbox->can_post_mail)
}
sys_sem_signal(mbox->mutex);
return time;
}
_______________________________________________________
Reply to this item at:
<http://savannah.nongnu.org/bugs/?23408>
_______________________________________________
Message sent via/by Savannah
http://savannah.nongnu.org/
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch,
Vadim G Melihow <=
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Kieran Mansley, 2008/05/28
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Simon Goldschmidt, 2008/05/28
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Vadim G Melihow, 2008/05/28
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Simon Goldschmidt, 2008/05/28
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Vadim G Melihow, 2008/05/28
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Vadim G Melihow, 2008/05/28
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Simon Goldschmidt, 2008/05/28
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Vadim G Melihow, 2008/05/28
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Kieran Mansley, 2008/05/30
- [lwip-devel] [bug #23408] Deadlock on sys_mbox_post sys_mbox_fetch, Kieran Mansley, 2008/05/30