Ticket #3995: 3995-v1.patch
File 3995-v1.patch, 2.9 KB (added by , 16 years ago) |
---|
-
libs/libmythtv/linuxfirewiredevice.cpp
53 53 avstream(NULL), channel(-1), 54 54 output_plug(-1), input_plug(-1), bandwidth(0), no_data_cnt(0), 55 55 is_p2p_node_open(false), is_bcast_node_open(false), 56 is_streaming(false) 56 is_streaming(false), is_waiting_to_close(false), 57 is_safe_to_close(true) 57 58 { 58 59 } 59 60 … … 83 84 bool is_p2p_node_open; 84 85 bool is_bcast_node_open; 85 86 bool is_streaming; 87 bool is_waiting_to_close; 88 bool is_safe_to_close; 86 89 87 90 QDateTime stop_streaming_timer; 88 91 pthread_t port_handler_thread; … … 580 583 if (m_priv->is_streaming) 581 584 StopStreaming(); 582 585 586 m_priv->is_waiting_to_close = true; 587 m_lock.lock(); 588 while (!m_priv->is_safe_to_close) 589 { 590 m_lock.unlock(); 591 usleep(5000); 592 m_lock.lock(); 593 } 583 594 iec61883_mpeg2_close(m_priv->avstream); 584 595 m_priv->avstream = NULL; 596 m_priv->is_waiting_to_close = false; 597 m_lock.unlock(); 585 598 586 599 return true; 587 600 } … … 599 612 m_lock.lock(); 600 613 VERBOSE(VB_RECORD, LOC + "RunPortHandler -- got first lock"); 601 614 m_priv->is_port_handler_running = true; 615 m_priv->is_safe_to_close = false; 602 616 603 617 m_priv->no_data_cnt = 0; 604 618 while (m_priv->run_port_handler) … … 621 635 ResetBus(); 622 636 } 623 637 638 if (m_priv->is_waiting_to_close) 639 { 640 m_priv->is_safe_to_close = true; 641 m_lock.unlock(); 642 usleep(kNoDataTimeout * 1000); 643 m_lock.lock(); 644 m_priv->is_safe_to_close = false; 645 } 646 624 647 int fwfd = raw1394_get_fd(GetInfoPtr()->fw_handle); 625 648 if (fwfd < 0) 626 649 { 627 650 // We unlock here because this can take a long time 628 651 // and we don't want to block other actions. 629 652 m_lock.unlock(); 630 usleep(kNoDataTimeout );653 usleep(kNoDataTimeout * 1000); 631 654 m_lock.lock(); 632 655 633 656 m_priv->no_data_cnt += (m_priv->is_streaming) ? 1 : 0; … … 638 661 // don't want to block other actions. All reads and writes 639 662 // are done with the lock, so this is safe so long as we 640 663 // check that we really have data once we get the lock. 664 m_priv->is_safe_to_close = false; 641 665 m_lock.unlock(); 642 666 bool ready = has_data(fwfd, kNoDataTimeout); 643 667 m_lock.lock(); 668 m_priv->is_safe_to_close = true; 644 669 645 670 if (!ready && m_priv->is_streaming) 646 671 { … … 666 691 } 667 692 } 668 693 694 m_priv->is_safe_to_close = true; 669 695 m_priv->is_port_handler_running = false; 670 696 m_lock.unlock(); 671 697 VERBOSE(VB_RECORD, LOC + "RunPortHandler -- end");