From 9d3eb438ccf08435248243b7bd249063bfe29fe5 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Wed, 31 Jul 2013 12:40:07 -0500 Subject: [PATCH] Avoid crash due to reentrancy in KDirWatch dirty/created/deleted signals --- admin | 2 +- src/toplevel.cpp | 17 +++++++++++++---- src/toplevel.h | 2 ++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/admin b/admin index 65ecce4..4027b87 160000 --- a/admin +++ b/admin @@ -1 +1 @@ -Subproject commit 65ecce459d54e772303052de50d08557ba9cc7ed +Subproject commit 4027b878fb556a51ed29affd578e78aa70997480 diff --git a/src/toplevel.cpp b/src/toplevel.cpp index ae2cd4d..beb0006 100644 --- a/src/toplevel.cpp +++ b/src/toplevel.cpp @@ -59,7 +59,7 @@ #include "toplevel.h" #include "toplevel.moc" -TopLevel::TopLevel() : KSystemTray(), ticketWatch(0), m_refreshTimer(0), notifyExpiryMinutes(0) +TopLevel::TopLevel() : KSystemTray(), ticketWatch(0), m_refreshTimer(0), m_requestUpdateTimer(0), notifyExpiryMinutes(0) { setBackgroundMode(X11ParentRelative); // what for? @@ -145,6 +145,15 @@ void TopLevel::setupTimers() { connect(m_refreshTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(updateTicketList())); m_refreshTimer->start(10*1000, false); } + + if (!m_requestUpdateTimer) { + m_requestUpdateTimer = new TQTimer(this); + connect(m_requestUpdateTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(updateTicketList())); + } +} + +void TopLevel::requestTicketListUpdate() { + m_requestUpdateTimer->start(0, TRUE); } void TopLevel::updateTicketList() { @@ -154,9 +163,9 @@ void TopLevel::updateTicketList() { if (!ticketWatch) { ticketWatch = new KDirWatch(); - connect(ticketWatch, TQT_SIGNAL(dirty(const TQString&)), this, TQT_SLOT(updateTicketList())); - connect(ticketWatch, TQT_SIGNAL(created(const TQString&)), this, TQT_SLOT(updateTicketList())); - connect(ticketWatch, TQT_SIGNAL(deleted(const TQString&)), this, TQT_SLOT(updateTicketList())); + connect(ticketWatch, TQT_SIGNAL(dirty(const TQString&)), this, TQT_SLOT(requestTicketListUpdate())); + connect(ticketWatch, TQT_SIGNAL(created(const TQString&)), this, TQT_SLOT(requestTicketListUpdate())); + connect(ticketWatch, TQT_SIGNAL(deleted(const TQString&)), this, TQT_SLOT(requestTicketListUpdate())); ticketWatch->addFile(m_ticketFile); ticketWatch->startScan(); } diff --git a/src/toplevel.h b/src/toplevel.h index 640b937..02261c3 100644 --- a/src/toplevel.h +++ b/src/toplevel.h @@ -64,6 +64,7 @@ private slots: void setToolTip(const TQString &text, bool force=false); void setupTimers(); + void requestTicketListUpdate(); void updateTicketList(); void updateMenu(); void getNewTGT(); @@ -92,6 +93,7 @@ private: TQString m_ticketFile; KDirWatch *ticketWatch; TQTimer *m_refreshTimer; + TQTimer *m_requestUpdateTimer; bool autostart; bool notifyExpiry;