summaryrefslogtreecommitdiffstats
path: root/abs/extra/libffado/fix-segfault-on-close.patch
blob: c81b97e40973394af93568c8fc77e2cf009da440 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Index: /trunk/libffado/src/debugmodule/debugmodule.h
===================================================================
--- /trunk/libffado/src/debugmodule/debugmodule.h (revision 1763)
+++ /trunk/libffado/src/debugmodule/debugmodule.h (revision 1999)
@@ -283,6 +283,10 @@
 void hexDumpQuadlets( quadlet_t *data_start, unsigned int length );
 
+class DebugModuleManager;
+
 class DebugModule {
 public:
+    friend class DebugModuleManager;
+
     enum {
         eDL_Message      = DEBUG_LEVEL_MESSAGE,
@@ -333,4 +337,5 @@
     std::string   m_name;
     debug_level_t m_level;
+    DebugModuleManager* m_manager;
 };
 
Index: /trunk/libffado/src/debugmodule/debugmodule.cpp
===================================================================
--- /trunk/libffado/src/debugmodule/debugmodule.cpp (revision 1763)
+++ /trunk/libffado/src/debugmodule/debugmodule.cpp (revision 1999)
@@ -84,5 +84,6 @@
 //              << endl;
 //     }
-    if ( !DebugModuleManager::instance()->unregisterModule( *this ) ) {
+
+    if (m_manager && !m_manager->unregisterModule( *this ) ) {
         cerr << "Could not unregister DebugModule at DebugModuleManager"
              << endl;
@@ -263,12 +264,9 @@
 DebugModuleManager::~DebugModuleManager()
 {
-    // cleanin up leftover modules
-    for ( DebugModuleVectorIterator it = m_debugModules.begin();
-          it != m_debugModules.end();
-          ++it )
+    // cleaning up leftover modules
+    while (!m_debugModules.empty())
     {
-        fprintf(stderr,"Cleaning up leftover debug module: %s\n",(*it)->getName().c_str());
-        m_debugModules.erase( it );
-        delete *it;
+        DebugModule *mod = m_debugModules.back();
+        unregisterModule(*mod);
     }
 
@@ -455,4 +453,6 @@
     } else {
         m_debugModules.push_back( &debugModule );
+        if (debugModule.m_manager == NULL)
+                debugModule.m_manager = this;
     }
     return true;
@@ -469,4 +469,6 @@
         if ( *it == &debugModule ) {
             m_debugModules.erase( it );
+            if (debugModule.m_manager == this)
+                debugModule.m_manager = NULL;
             return true;
         }