Hmmm... does this relate to the issues that I was seeing where owserver
would crash with the Assertion:
 
"...tpp.c:66: __pthread_tpp_change_priority: Assertion..." 
 
If it is then I'll rebuild from the latest source and see if it makes a
difference. Currently I'm running an older version that doesn't have the
Assertion issue.
 
Alex 


________________________________

        From: Paul Alfille [mailto:[email protected]] 
        Sent: Thursday, 19 August 2010 7:35 a.m.
        To: owfs-developers
        Subject: [Owfs-developers] owserver mutext bug solved.
        
        
        Leon did some careful sleuthing and found an architecture-dependent
bug in the the locking model for owserver. The problem is mostlikely some
problem with the mutex implementation on that platform, but the problem
seems solved.
        
        In his words, the problem:
        -------
        Submitted By: Leon (nleonard671)
        Assigned to: Nobody/Anonymous (nobody)
        Summary: owserver crashes on client disconnection on Mips CPU
        
        Initial Comment:
        I'm using OWFS with an OpenWrt OS on a MIPS cpu (exact model: MIPS
24Kc V7.4) and I have a 100% reproductible crash problem with owserver.
        Step to reproduce:
         1. Launch owserver, no matter if you use fake device or real device
(DS9490 in my case)
         2. Launch "owget /"
        => Segmentation fault in the server
        -----------
        
        
        And the solution:
        --------------
        Ok, I've finally managed to find out the bug. It's a race condition
between
        the 'ping loop' (owserver/loop.c) and the 'data handler'
        (owserver/data.c).
        
        Possible crash explanation:
         1. [data.c:DataHandler()] Data thread lock the TOCLIENT mutex,
sets the
        hd->toclient to toclient_complete then write some dummy data to the
pipe,
        to wakeup the PingLoop thread (line 215)
         2. [loop.c:Ping_or_Send()] Ping thread select is 'awaked' by the
pipe
        data (line 92) and returns without locking the TOCLIENT mutex (line
96)
         3. [loop.c:PingLoop()] Exist from the loop and execute
LoopCleanup(à,
        which destroys the TOCLIENT mutex
         4. [data.c:DataHandler()] Data thread unlocks the TOCLIENT mutex
(line
        218), and crashes
        I didn't notice early, but in my output log files, the statement
"Finished
        with client request" (data.c:222) was never written, confirming that
the
        data thread crashes before.
        
        I tried to reproduce it unsuccessfully on my development hardware
(x86) -
        maybe the uClibc pthread implementation used by OpenWrt has a
different
        behavior than the glibc's one.
        
        A working fix: instead of returning of c:Ping_or_Send() directly
after the
        select(), a lock/unlock step is executed, allowing the data thread
to
        finish properly before destroying the shared resources.
        
        --- owfs-2.8p0-ORIG/module/ 
        owserver/src/c/loop.c        2010-05-08
        20:47:10.000000000 +0200
        +++ owfs-2.8p0/module/owserver/src/c/loop.c     2010-08-18
        02:49:27.000000000 +0200
        @@ -93,7 +93,7 @@
        
               // read pipe shows final data was sent
               if ( select_value == 1 ) {
        -               return toclient_complete ;
        +               next_toclient = toclient_complete ;
               }
        
               TOCLIENTLOCK(hd);
        
        ---------------------
        
        
        Thanks!
        Paul Alfille
        
        




------------------------------------------------------------------------------
This SF.net email is sponsored by 

Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev 
_______________________________________________
Owfs-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/owfs-developers

Reply via email to