Hello,
Sorry for the looooong time it took me to test your patch.
It worked well for me both on my arm target and on my desktop.
Thank you !
On 06/20/11 22:59, Chris Frey wrote:
> On Tue, Jun 14, 2011 at 03:13:21PM +0200, Nicolas CARRIER wrote:
>> I from time to time, had pppob not terminating properly. As I couldn't
>> figure out why, I tried to suppress possible causes.
>> What is sure is that in some bad timing circumstances, the signal could
>> be handled right before the select statement hence resulting in a
>> useless 30 seconds timeout, which this kind of patch should avoid.
> I did a bit of testing here, and it seems to consistently hang in the
> pthread_join() in the IpModem::Close() function.
>
> Not sure exactly why, but it seems that having two threads calling
> libusb's bulk read might be problematic. Could you give this patch
> a try, and let me know if it fixes the problem?
>
> Thanks,
> - Chris
>
>
> Subject: [PATCH] lib: fixed hang in IPModem Close
>
> If the data read thread is still going, then there is no need to do
> an explicit BulkRead() in the Close() routine. Only do this if the
> thread is not running.
>
> When two libusb reads are done at the same time on the same endpoint
> from different threads, it seems like it causes a hang in the pthread_join().
> Not sure why.
> ---
> src/m_ipmodem.cc | 21 +++++++++++++--------
> 1 files changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/src/m_ipmodem.cc b/src/m_ipmodem.cc
> index b7ea0ec..6b286c3 100644
> --- a/src/m_ipmodem.cc
> +++ b/src/m_ipmodem.cc
> @@ -414,19 +414,24 @@ void IpModem::Close()
> memcpy(&end[24], special_flag, sizeof(special_flag));
> m_dev.BulkWrite(write_ep, end, sizeof(end));
> m_dev.BulkWrite(write_ep, stop, sizeof(stop));
> - try {
> - m_dev.BulkRead(read_ep, data, 5000);
> - ddout("IPModem: Close read packet:\n"<< data);
> - }
> - catch( Usb::Timeout&to ) {
> - // do nothing on timeouts
> - ddout("IPModem: Close Read Timeout");
> - }
> +
> // stop the read thread
> if( m_continue_reading ) {
> m_continue_reading = false;
> pthread_join(m_modem_read_thread, NULL);
> }
> + else {
> + // otherwise, drain the last read
> + try {
> + m_dev.BulkRead(read_ep, data, 5000);
> + ddout("IPModem: Close read packet:\n"<< data);
> + }
> + catch( Usb::Timeout&to ) {
> + // do nothing on timeouts
> + ddout("IPModem: Close Read Timeout");
> + }
> + }
> +
> ddout("IPmodem: Closed!");
>
> }
--
Nicolas CARRIER - 6081 - 2ème centre
------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security
threats, fraudulent activity, and more. Splunk takes this data and makes
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
_______________________________________________
Barry-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/barry-devel