From: <ibr...@us...> - 2011-08-09 17:01:56
|
Revision: 4033 http://tora.svn.sourceforge.net/tora/?rev=4033&view=rev Author: ibre5041 Date: 2011-08-09 17:01:49 +0000 (Tue, 09 Aug 2011) Log Message: ----------- Fix deadlock and segfault in alert window. Also handles situation when has not rights on DBMS_ALERT. Modified Paths: -------------- branches/tora-trotl/src/toalert.cpp Modified: branches/tora-trotl/src/toalert.cpp =================================================================== --- branches/tora-trotl/src/toalert.cpp 2011-08-09 12:39:43 UTC (rev 4032) +++ branches/tora-trotl/src/toalert.cpp 2011-08-09 17:01:49 UTC (rev 4033) @@ -107,7 +107,7 @@ return window; } } - void closeWindow(toConnection &connection) + virtual void closeWindow(toConnection &connection) { std::map<toConnection *, QWidget *>::iterator i = Windows.find(&connection); if (i != Windows.end()) @@ -232,6 +232,7 @@ TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; toStatusMessage(tr("Failed to start polling thread, try closing " "some other tools and restart Alert Messenger")); + State = Done; } setFocusProxy(Message); @@ -271,20 +272,18 @@ void toAlert::closeEvent(QCloseEvent *event) { - try - { - Lock.lock(); - State = Quit; - while (State != Done) - { - Lock.unlock(); - Semaphore.down(); - Lock.lock(); - } - Lock.unlock(); - AlertTool.closeWindow(connection()); - } - TOCATCH; + if(State == Done) + { + AlertTool.closeWindow(connection()); + return; + } + + State = Quit; + while (State != Done) + { + Semaphore.down(); + } + AlertTool.closeWindow(connection()); } static toSQL SQLRegister("toAlert:Register", @@ -312,6 +311,7 @@ { Parent.Lock.lock(); bool fatal = false; + bool namesEmpty; while (Parent.State != Quit && !fatal) { Parent.Lock.unlock(); @@ -363,11 +363,15 @@ Parent.SendMessages.clear(); Parent.Connection.commit(); } - - Parent.Lock.lock(); - if (Parent.Names.size()) + + { + toLocker lock (Parent.Lock) + ; + namesEmpty = Parent.Names.empty(); + } + //Parent.Lock.lock(); + if (!namesEmpty) { - Parent.Lock.unlock(); toQuery query(Parent.Connection, SQLPoll, QString::number(TIMEOUT)); QString name = query.readValue(); QString msg = query.readValue(); @@ -381,13 +385,7 @@ } else { - Parent.Lock.unlock(); -#ifndef Q_OS_WIN32 - sleep(TIMEOUT); -#else - - Sleep(TIMEOUT*1000); -#endif + toThread::sleep(TIMEOUT); } } catch (const QString &str) @@ -395,6 +393,7 @@ Parent.Lock.lock(); Parent.Error.sprintf("Exception in alert polling:\n%s", (const char *)str.toLatin1()); fprintf(stderr, "%s\n", Parent.Error.toAscii().constData()); + fatal = true; Parent.Lock.unlock(); } catch (...) @@ -402,12 +401,13 @@ Parent.Lock.lock(); Parent.Error.sprintf("Unexpected exception in alert in polling."); fprintf(stderr, "%s\n", Parent.Error.toAscii().constData()); + fatal = true; Parent.Lock.unlock(); } Parent.Lock.lock(); } - if (Parent.Names.size() > 0) + if (!Parent.Names.empty()) try { Parent.Connection.execute(SQLRemoveAll); @@ -415,6 +415,7 @@ catch (...) { TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; + fatal = true; } Parent.State = Done; Parent.Semaphore.up(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |