lwip-devel
[Top][All Lists]
Advanced

[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/





reply via email to

[Prev in Thread] Current Thread [Next in Thread]