[ekiga/v4_0] [windows] Fix freeze on quit



commit 38823bab462589e835314635540d1f309d2564d5
Author: Eugen Dedu <Eugen Dedu pu-pm univ-fcomte fr>
Date:   Mon Feb 18 16:59:02 2013 +0100

    [windows] Fix freeze on quit
    
    This commits replaces delete x (where x inherits PThread) with calling
    a quit function which does the same thing as the destructor, and
    letting ptlib deleting the thread later.
    
    Before this commit, the thread calling delete always frozen on
    TerminateThread function.  Anyway, calling this function is dangerous
    (see
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms686717%28v=vs.85%29.aspx),
    so we must ensure that the target thread has finished all its job,
    which is what this commit does.
    
    Fixes bug #671818.

 lib/engine/audiooutput/audiooutput-core.cpp        |    2 +-
 lib/engine/audiooutput/audiooutput-scheduler.cpp   |    5 ++---
 lib/engine/audiooutput/audiooutput-scheduler.h     |    2 +-
 .../dx-videooutput/videooutput-manager-dx.cpp      |    4 ++++
 .../dx-videooutput/videooutput-manager-dx.h        |    4 +++-
 .../x-videooutput/videooutput-manager-x.cpp        |    4 ++++
 .../x-videooutput/videooutput-manager-x.h          |    2 ++
 lib/engine/videoinput/videoinput-core.cpp          |    6 +++---
 lib/engine/videoinput/videoinput-core.h            |    4 +---
 lib/engine/videooutput/videooutput-core.cpp        |    2 +-
 lib/engine/videooutput/videooutput-manager.h       |    1 +
 11 files changed, 23 insertions(+), 13 deletions(-)
---
diff --git a/lib/engine/audiooutput/audiooutput-core.cpp b/lib/engine/audiooutput/audiooutput-core.cpp
index be2bfc9..9c53489 100644
--- a/lib/engine/audiooutput/audiooutput-core.cpp
+++ b/lib/engine/audiooutput/audiooutput-core.cpp
@@ -85,7 +85,7 @@ AudioOutputCore::~AudioOutputCore ()
   if (audiooutput_core_conf_bridge)
     delete audiooutput_core_conf_bridge;
 
-  delete audio_event_scheduler;
+  audio_event_scheduler->quit ();
 
   for (std::set<AudioOutputManager *>::iterator iter = managers.begin ();
        iter != managers.end ();
diff --git a/lib/engine/audiooutput/audiooutput-scheduler.cpp 
b/lib/engine/audiooutput/audiooutput-scheduler.cpp
index e5f46dd..9972605 100644
--- a/lib/engine/audiooutput/audiooutput-scheduler.cpp
+++ b/lib/engine/audiooutput/audiooutput-scheduler.cpp
@@ -44,7 +44,7 @@
 using namespace Ekiga;
 
 AudioEventScheduler::AudioEventScheduler (AudioOutputCore& _audio_output_core)
-: PThread (1000, NoAutoDeleteThread, HighestPriority, "AudioEventScheduler"),
+: PThread (1000, AutoDeleteThread, HighestPriority, "AudioEventScheduler"),
   audio_output_core (_audio_output_core)
 {
   end_thread = false;
@@ -54,14 +54,13 @@ AudioEventScheduler::AudioEventScheduler (AudioOutputCore& _audio_output_core)
   thread_created.Wait ();
 }
 
-AudioEventScheduler::~AudioEventScheduler ()
+void AudioEventScheduler::quit ()
 {
   end_thread = true;
   run_thread.Signal ();
 
   /* Wait for the Main () method to be terminated */
   PWaitAndSignal m(thread_ended);
-
 }
 
 void AudioEventScheduler::Main ()
diff --git a/lib/engine/audiooutput/audiooutput-scheduler.h b/lib/engine/audiooutput/audiooutput-scheduler.h
index fdd0d8e..3520d4e 100644
--- a/lib/engine/audiooutput/audiooutput-scheduler.h
+++ b/lib/engine/audiooutput/audiooutput-scheduler.h
@@ -73,7 +73,7 @@ namespace Ekiga
 
   public:
     AudioEventScheduler(Ekiga::AudioOutputCore& _audio_output_core);
-    ~AudioEventScheduler();
+    void quit ();
     void add_event_to_queue(const std::string & name, bool is_file_name, unsigned interval, unsigned 
repetitions);
     void remove_event_from_queue(const std::string & name);
     void set_file_name(const std::string & event_name, const std::string & file_name, AudioOutputPS ps, bool 
enabled);
diff --git a/lib/engine/components/dx-videooutput/videooutput-manager-dx.cpp 
b/lib/engine/components/dx-videooutput/videooutput-manager-dx.cpp
index 89399d9..388bcdd 100644
--- a/lib/engine/components/dx-videooutput/videooutput-manager-dx.cpp
+++ b/lib/engine/components/dx-videooutput/videooutput-manager-dx.cpp
@@ -52,6 +52,10 @@ GMVideoOutputManager_dx::GMVideoOutputManager_dx (Ekiga::ServiceCore & _core)
 
 GMVideoOutputManager_dx::~GMVideoOutputManager_dx ()
 {
+}
+
+void GMVideoOutputManager_dx::quit ()
+{
   end_thread = true;
   run_thread.Signal();
   thread_ended.Wait();
diff --git a/lib/engine/components/dx-videooutput/videooutput-manager-dx.h 
b/lib/engine/components/dx-videooutput/videooutput-manager-dx.h
index d7e2e9c..768df34 100644
--- a/lib/engine/components/dx-videooutput/videooutput-manager-dx.h
+++ b/lib/engine/components/dx-videooutput/videooutput-manager-dx.h
@@ -56,7 +56,9 @@
     GMVideoOutputManager_dx (Ekiga::ServiceCore & _core);
 
     virtual ~GMVideoOutputManager_dx ();
-  
+
+    virtual void quit ();
+
     virtual bool frame_display_change_needed ();
 
     virtual void setup_frame_display ();
diff --git a/lib/engine/components/x-videooutput/videooutput-manager-x.cpp 
b/lib/engine/components/x-videooutput/videooutput-manager-x.cpp
index 92ddd97..8b4bb44 100644
--- a/lib/engine/components/x-videooutput/videooutput-manager-x.cpp
+++ b/lib/engine/components/x-videooutput/videooutput-manager-x.cpp
@@ -71,6 +71,10 @@ GMVideoOutputManager_x::GMVideoOutputManager_x (Ekiga::ServiceCore & _core)
 
 GMVideoOutputManager_x::~GMVideoOutputManager_x ()
 {
+}
+
+void GMVideoOutputManager_x::quit ()
+{
   end_thread = true;
   run_thread.Signal();
   thread_ended.Wait();
diff --git a/lib/engine/components/x-videooutput/videooutput-manager-x.h 
b/lib/engine/components/x-videooutput/videooutput-manager-x.h
index a5f20a7..7cad59a 100644
--- a/lib/engine/components/x-videooutput/videooutput-manager-x.h
+++ b/lib/engine/components/x-videooutput/videooutput-manager-x.h
@@ -61,6 +61,8 @@ public:
 
   virtual ~GMVideoOutputManager_x ();
 
+  virtual void quit ();
+
   virtual bool frame_display_change_needed ();
 
   virtual void setup_frame_display ();
diff --git a/lib/engine/videoinput/videoinput-core.cpp b/lib/engine/videoinput/videoinput-core.cpp
index b00d03b..f3a84ba 100644
--- a/lib/engine/videoinput/videoinput-core.cpp
+++ b/lib/engine/videoinput/videoinput-core.cpp
@@ -49,7 +49,7 @@
 using namespace Ekiga;
 
 VideoInputCore::VideoPreviewManager::VideoPreviewManager (VideoInputCore& _videoinput_core, 
boost::shared_ptr<VideoOutputCore> _videooutput_core)
-: PThread (1000, NoAutoDeleteThread, HighestPriority, "VideoPreviewManager"),
+: PThread (1000, AutoDeleteThread, HighestPriority, "VideoPreviewManager"),
     videoinput_core (_videoinput_core),
   videooutput_core (_videooutput_core)
 {
@@ -64,7 +64,7 @@ VideoInputCore::VideoPreviewManager::VideoPreviewManager (VideoInputCore& _video
   thread_paused.Wait();
 }
 
-VideoInputCore::VideoPreviewManager::~VideoPreviewManager ()
+void VideoInputCore::VideoPreviewManager::quit ()
 {
   if (!pause_thread)
     stop();
@@ -164,7 +164,7 @@ VideoInputCore::~VideoInputCore ()
   if (videoinput_core_conf_bridge)
     delete videoinput_core_conf_bridge;
 
-  delete preview_manager;
+  preview_manager->quit ();
 
   for (std::set<VideoInputManager *>::iterator iter = managers.begin ();
        iter != managers.end ();
diff --git a/lib/engine/videoinput/videoinput-core.h b/lib/engine/videoinput/videoinput-core.h
index 967ee6a..3f87f89 100644
--- a/lib/engine/videoinput/videoinput-core.h
+++ b/lib/engine/videoinput/videoinput-core.h
@@ -332,9 +332,7 @@ private:
         */
         VideoPreviewManager(VideoInputCore & _videoinput_core, boost::shared_ptr<VideoOutputCore> 
_videooutput_core);
 
-        /** The destructor
-        */
-        ~VideoPreviewManager();
+        void quit();
 
         /** Start the preview thread.
         * Start the thread represented by the Main() function. Block until the thread is running.
diff --git a/lib/engine/videooutput/videooutput-core.cpp b/lib/engine/videooutput/videooutput-core.cpp
index 497c136..4e50a73 100644
--- a/lib/engine/videooutput/videooutput-core.cpp
+++ b/lib/engine/videooutput/videooutput-core.cpp
@@ -68,7 +68,7 @@ VideoOutputCore::~VideoOutputCore ()
   for (std::set<VideoOutputManager *>::iterator iter = managers.begin ();
        iter != managers.end ();
        iter++)
-    delete (*iter);
+    (*iter)->quit ();
 
   managers.clear();
 }
diff --git a/lib/engine/videooutput/videooutput-manager.h b/lib/engine/videooutput/videooutput-manager.h
index c9e22b5..0a1f337 100644
--- a/lib/engine/videooutput/videooutput-manager.h
+++ b/lib/engine/videooutput/videooutput-manager.h
@@ -69,6 +69,7 @@ namespace Ekiga
        */
       virtual ~VideoOutputManager () {}
 
+      virtual void quit () { };
 
       /*** API for video output ***/
 


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