refresh frame fix, dblclk proxy viewer fix, vicon refresh fix for awdw resize, fix...
[goodguy/history.git] / cinelerra-5.1 / guicast / bctrace.h
index e510c3105e78b7276bf9b88da6f30923949e4c9b..51dafd7466bf4ca6174636a9340a1a948b68c791 100644 (file)
@@ -8,6 +8,12 @@
 #include "cstrdup.h"
 #include <pthread.h>
 
+#ifdef BOOBY
+#define BT if( top_level->display_lock_owner != pthread_self() ) booby();
+void booby();
+#else
+#define BT
+#endif
 
 class BC_Trace
 {
@@ -48,6 +54,9 @@ public:
        static void dump_locks(FILE *fp=stdout);
        static void dump_buffers(FILE *fp=stdout);
        static void dump_threads(FILE *fp=stdout);
+
+       static void dump_shm_stat(const char *fn, FILE *fp=stdout);
+       static void dump_shm_stats(FILE *fp=stdout);
 };
 
 class bc_trace_list : public List<trace_item> {
@@ -179,19 +188,24 @@ public:
        void lock() { pthread_mutex_lock(&the_lock); }
        void unlock() { pthread_mutex_unlock(&the_lock); }
 
-       TheLock() {
+       void init() {
                pthread_mutexattr_t attr;
                pthread_mutexattr_init(&attr);
                pthread_mutex_init(&the_lock, &attr);
        }
-       ~TheLock() {
+       void finit() {
                pthread_mutex_destroy(&the_lock);
        }
+       void reset() { finit();  init(); }
+
+       TheLock()  { init();  }
+       ~TheLock() { finit(); }
 };
 
 class TheLocker {
 public:
        static TheLock the_lock;
+       static void reset() { the_lock.reset(); }
 
        TheLocker() { the_lock.lock(); }
        ~TheLocker() { the_lock.unlock(); }
@@ -211,28 +225,18 @@ public:
        static void dump_threads(FILE *fp);
        static void dbg_add(pthread_t tid, pthread_t owner, const char *nm);
        static void dbg_del(pthread_t tid);
-
-        TheList() {}
-       ~TheList() {
-               TheLocker the_locker;
-               remove_all_objects();
-       }
-};
-
-class TheChk {
-public:
-       static TheChk the_chk;
-
-       TheChk() {}
-       ~TheChk() {
-               int i = TheList::the_list.size();
+       static void reset() { the_list.remove_all_objects(); TheLocker::reset(); }
+       void check() {
+               int i = the_list.size();
                if( !i ) return;
                printf("unjoined tids / owner %d\n", i);
                while( --i >= 0 ) printf("  %016lx / %016lx %s\n",
-                       (unsigned long)TheList::the_list[i]->tid,
-                       (unsigned long)TheList::the_list[i]->owner,
-                       TheList::the_list[i]->name);
+                       (unsigned long)the_list[i]->tid,
+                       (unsigned long)the_list[i]->owner,
+                       the_list[i]->name);
        }
+        TheList() {}
+       ~TheList() { check(); reset(); }
 };
 
 #endif