diff --git a/src/kernel/qfont.cpp b/src/kernel/qfont.cpp index 44168a1f..d9600b7a 100644 --- a/src/kernel/qfont.cpp +++ b/src/kernel/qfont.cpp @@ -61,15 +61,82 @@ #include "qpainter_p.h" #include "qtextengine_p.h" -// #define TQFONTCACHE_DEBUG +//#define TQFONTCACHE_DEBUG #ifdef TQFONTCACHE_DEBUG # define FC_DEBUG tqDebug #else # define FC_DEBUG if (FALSE) tqDebug #endif +#include +template +class CreationTracerNoop { +public: + void newO(T* ) {} + void delO(T* ) {} +}; +template +class CreationTracer { + struct TracerData { + char **bt; + int bt_sz; + }; + typedef TQMap MapType; + MapType aliveObj; +public: + + void newO(T* o) { + const size_t buf_sz = 128; + void *buf[buf_sz]; + + int bt_sz = backtrace (buf, buf_sz); + aliveObj.insert(o, TracerData{backtrace_symbols(buf, bt_sz), bt_sz} ); + } + + void delO(T* o) { + auto it =aliveObj.find(o); + if(it!=aliveObj.end()) { + free(it.data().bt); + aliveObj.remove(it); + } + + } + + ~CreationTracer() { + std::string fname = typeid(T).name(); + fname.append("-undestroyed"); + FILE *f = fopen(fname.c_str(), "w"); + if(!f) { + return; + } + for(auto it = aliveObj.begin(), endIt = aliveObj.end(); it!=endIt; ++it) { + for(int i=0; i INIT_FIRST TQFontTracer; +#else +static CreationTracerNoop TQFontTracer; +#endif // TQFONT_TRACE + +#ifdef TQFONT_TRACE +static CreationTracer INIT_FIRST TQFontMetricsTracer; +#else +static CreationTracerNoop TQFontMetricsTracer; +#endif // TQFONT_TRACE bool TQFontDef::operator==( const TQFontDef &other ) const { @@ -534,6 +601,7 @@ TQFontEngineData::~TQFontEngineData() */ TQFont::TQFont( TQFontPrivate *data, TQPaintDevice *pd ) { + TQFontTracer.newO(this); d = new TQFontPrivate( *data ); TQ_CHECK_PTR( d ); d->paintdevice = pd; @@ -578,6 +646,7 @@ void TQFont::detach() */ TQFont::TQFont() { + TQFontTracer.newO(this); const TQFont appfont = TQApplication::font(); d = appfont.d; d->ref(); @@ -602,6 +671,7 @@ TQFont::TQFont() */ TQFont::TQFont( const TQString &family, int pointSize, int weight, bool italic ) { + TQFontTracer.newO(this); d = new TQFontPrivate; TQ_CHECK_PTR( d ); @@ -632,6 +702,7 @@ TQFont::TQFont( const TQString &family, int pointSize, int weight, bool italic ) */ TQFont::TQFont( const TQFont &font ) { + TQFontTracer.newO(this); d = font.d; d->ref(); } @@ -641,6 +712,7 @@ TQFont::TQFont( const TQFont &font ) */ TQFont::~TQFont() { + TQFontTracer.delO(this); if ( d->deref() ) delete d; d = 0; @@ -1893,6 +1965,7 @@ TQDataStream &operator>>( TQDataStream &s, TQFont &font ) TQFontMetrics::TQFontMetrics( const TQFont &font ) : d( font.d ), painter( 0 ), fscript( TQFont::NoScript ) { + TQFontMetricsTracer.newO(this); d->ref(); } @@ -1905,6 +1978,7 @@ TQFontMetrics::TQFontMetrics( const TQFont &font ) TQFontMetrics::TQFontMetrics( const TQFont &font, TQFont::Script script ) : d( font.d ), painter( 0 ), fscript( script ) { + TQFontMetricsTracer.newO(this); d->ref(); } @@ -1915,6 +1989,7 @@ TQFontMetrics::TQFontMetrics( const TQFont &font, TQFont::Script script ) TQFontMetrics::TQFontMetrics( const TQPainter *p ) : painter ( (TQPainter *) p ), fscript( TQFont::NoScript ) { + TQFontMetricsTracer.newO(this); #if defined(CHECK_STATE) if ( !painter->isActive() ) tqWarning( "TQFontMetrics: Get font metrics between TQPainter::begin() " @@ -1944,6 +2019,7 @@ TQFontMetrics::TQFontMetrics( const TQPainter *p ) TQFontMetrics::TQFontMetrics( const TQFontMetrics &fm ) : d( fm.d ), painter( 0 ), fscript( fm.fscript ) { + TQFontMetricsTracer.newO(this); d->ref(); } @@ -1953,6 +2029,7 @@ TQFontMetrics::TQFontMetrics( const TQFontMetrics &fm ) */ TQFontMetrics::~TQFontMetrics() { + TQFontMetricsTracer.delO(this); if ( d->deref() ) delete d; } diff --git a/src/kernel/qfontdata_p.h b/src/kernel/qfontdata_p.h index 9c21dfe6..4647fedb 100644 --- a/src/kernel/qfontdata_p.h +++ b/src/kernel/qfontdata_p.h @@ -121,6 +121,9 @@ public: TQFontEngineData(); ~TQFontEngineData(); + void ref(){TQShared::ref();} + bool deref(){return TQShared::deref();} + uint lineWidth; #if defined(TQ_WS_X11) || defined(TQ_WS_WIN) @@ -147,6 +150,9 @@ public: TQFontPrivate( const TQFontPrivate &other ); ~TQFontPrivate(); + void ref(){TQShared::ref();} + bool deref(){return TQShared::deref();} + void load( TQFont::Script script ); TQFontEngine *engineForScript( TQFont::Script script ) const { if ( script == TQFont::NoScript )