comparison base/Debug.cpp @ 950:387fa69f4eaa

Per-thread debug (avoiding some dubious threading problems)
author Chris Cannam
date Fri, 25 Jul 2014 15:21:41 +0100
parents 90e9a3f873cf
children 4b9fc70a37d5
comparison
equal deleted inserted replaced
948:6d2ece0fe356 950:387fa69f4eaa
22 #include <QMutexLocker> 22 #include <QMutexLocker>
23 #include <QFile> 23 #include <QFile>
24 #include <QDir> 24 #include <QDir>
25 #include <QCoreApplication> 25 #include <QCoreApplication>
26 #include <QDateTime> 26 #include <QDateTime>
27 #include <QThreadStorage>
27 28
28 #include <cstdio> 29 #include <cstdio>
30
31 static QThreadStorage<QDebug *> debugs;
32 static QMutex mutex;
33 static QFile *logFile = 0;
34 static char *prefix = 0;
29 35
30 QDebug & 36 QDebug &
31 getSVDebug() 37 getSVDebug()
32 { 38 {
33 static QFile *logFile = 0;
34 static QDebug *debug = 0;
35 static QMutex mutex;
36 static char *prefix;
37
38 mutex.lock(); 39 mutex.lock();
39 40
40 if (!debug) { 41 QDebug *debug = 0;
42
43 if (!prefix) {
41 prefix = new char[20]; 44 prefix = new char[20];
42 sprintf(prefix, "[%lu]", (unsigned long)QCoreApplication::applicationPid()); 45 sprintf(prefix, "[%lu]", (unsigned long)QCoreApplication::applicationPid());
43 QString pfx = ResourceFinder().getUserResourcePrefix(); 46 QString pfx = ResourceFinder().getUserResourcePrefix();
44 QDir logdir(QString("%1/%2").arg(pfx).arg("log")); 47 QDir logdir(QString("%1/%2").arg(pfx).arg("log"));
45 if (!logdir.exists()) logdir.mkpath(logdir.path()); 48 if (!logdir.exists()) logdir.mkpath(logdir.path());
46 logFile = new QFile(logdir.path() + "/sv-debug.log"); 49 logFile = new QFile(logdir.path() + "/sv-debug.log");
47 if (logFile->open(QIODevice::WriteOnly | QIODevice::Truncate)) { 50 if (logFile->open(QIODevice::WriteOnly | QIODevice::Truncate)) {
48 QDebug(QtDebugMsg) << (const char *)prefix 51 QDebug(QtDebugMsg) << (const char *)prefix
49 << "Opened debug log file " 52 << "Opened debug log file "
50 << logFile->fileName(); 53 << logFile->fileName();
51 debug = new QDebug(logFile);
52 } else { 54 } else {
53 QDebug(QtWarningMsg) << (const char *)prefix 55 QDebug(QtWarningMsg) << (const char *)prefix
54 << "Failed to open debug log file " 56 << "Failed to open debug log file "
55 << logFile->fileName() 57 << logFile->fileName()
56 << " for writing, using console debug instead"; 58 << " for writing, using console debug instead";
57 debug = new QDebug(QtDebugMsg);
58 delete logFile; 59 delete logFile;
59 logFile = 0; 60 logFile = 0;
60 } 61 }
62 }
63
64 if (debugs.hasLocalData()) {
65 debug = debugs.localData();
66 } else {
67 if (logFile) {
68 debug = new QDebug(logFile);
69 } else {
70 debug = new QDebug(QtDebugMsg);
71 }
72 debugs.setLocalData(debug);
61 *debug << endl << (const char *)prefix << "Log started at " 73 *debug << endl << (const char *)prefix << "Log started at "
62 << QDateTime::currentDateTime().toString(); 74 << QDateTime::currentDateTime().toString();
63 } 75 }
64 76
77 mutex.unlock();
78
65 QDebug &dref = *debug; 79 QDebug &dref = *debug;
66 dref << endl << (const char *)prefix; 80 dref << endl << (const char *)prefix;
67 81
68 mutex.unlock();
69 return dref; 82 return dref;
70 } 83 }
71 84
72 QDebug & 85 QDebug &
73 operator<<(QDebug &dbg, const std::string &s) 86 operator<<(QDebug &dbg, const std::string &s)