Mercurial > hg > svcore
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) |