[ekiga] [windows] Fix freeze on quit



commit b57d99613f3cb25cc3a8508bfc7f55db13b84720
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 a61a948..add180f 100644
--- a/lib/engine/audiooutput/audiooutput-core.cpp
+++ b/lib/engine/audiooutput/audiooutput-core.cpp
@@ -82,7 +82,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 f954392..4bce59f 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 0c6778d..8697f28 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 b84cc1a..d2009ed 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 1836a37..e772900 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 c498544..8c63003 100644
--- a/lib/engine/videoinput/videoinput-core.cpp
+++ b/lib/engine/videoinput/videoinput-core.cpp
@@ -47,7 +47,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)
 {
@@ -62,7 +62,7 @@ VideoInputCore::VideoPreviewManager::VideoPreviewManager (VideoInputCore& _video
   thread_paused.Wait();
 }
 
-VideoInputCore::VideoPreviewManager::~VideoPreviewManager ()
+void VideoInputCore::VideoPreviewManager::quit ()
 {
   if (!pause_thread)
     stop();
@@ -162,7 +162,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 a784d4c..19ceed1 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 5d819ac..599bfbd 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]