[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lwip-devel] [bug #31741] lwip_select seems to have threading problems

From: Simon Goldschmidt
Subject: [lwip-devel] [bug #31741] lwip_select seems to have threading problems
Date: Thu, 02 Dec 2010 11:37:30 +0000
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv: Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729)


                 Summary: lwip_select seems to have threading problems
                 Project: lwIP - A Lightweight TCP/IP stack
            Submitted by: goldsimon
            Submitted on: Do 02 Dez 2010 11:37:30 GMT
                Category: sockets
                Severity: 4 - Important
              Item Group: Crash Error
                  Status: None
                 Privacy: Public
             Assigned to: None
             Open/Closed: Open
         Discussion Lock: Any
         Planned Release: 1.4.0
            lwIP version: CVS Head



>From lwip-users:

As for the crash I mentioned, it occurs in event_callbacks' select
handling, and is not the result of the above-mentioned threading limitation.

It seems to be the result of changing the synchronization mechanism in
1.4.0. lwIP 1.3.2 used a "broad" semaphore to synchronize event_callback
and lwip_select whereas 1.4.0 rc1 uses the critical section and a counter.

The following code in event_callback crashes when dereferencing scb:

        for (scb = select_cb_list; scb; scb = scb->next) {

We have found the following problems:

1. In the event_callback code:

        /* unlock interrupts with each step */

        last_select_cb_ctr = select_cb_ctr;
        if (last_select_cb_ctr != select_cb_ctr) {
            /* someone has changed select_cb_list, restart at the
beginning */
            scb = select_cb_list;


When someone removes the last element in the list (scb == NULL) we
should break out of the loop.

2. In lwip_select, the counter is not updated when an element is removed
from the list.

        /* Take us off the list */
        if (select_cb.next != NULL) {
            select_cb.next->prev = select_cb.prev;
        if (select_cb_list == &select_cb) {
            LWIP_ASSERT("select_cb.prev == NULL", select_cb.prev == NULL);
            select_cb_list = select_cb.next;
        } else {
            LWIP_ASSERT("select_cb.prev != NULL", select_cb.prev != NULL);
            select_cb.prev->next = select_cb.next;


Reply to this item at:


  Nachricht geschickt von/durch Savannah

reply via email to

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