Mercurial > hg > piper-cpp
comparison vamp-client/ProcessQtTransport.h @ 134:3dcf0394971d
Debug output improvements, and make the checker actually attempt to call the descriptor function for known plugin types
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Wed, 16 Nov 2016 16:12:42 +0000 |
parents | 2004ec2b653e |
children | 228a66adfb30 |
comparison
equal
deleted
inserted
replaced
133:74a7c2a8d6b6 | 134:3dcf0394971d |
---|---|
61 * support switching threads. | 61 * support switching threads. |
62 */ | 62 */ |
63 class ProcessQtTransport : public SynchronousTransport | 63 class ProcessQtTransport : public SynchronousTransport |
64 { | 64 { |
65 public: | 65 public: |
66 ProcessQtTransport(std::string processName, std::string formatArg) : | 66 ProcessQtTransport(std::string processName, |
67 std::string formatArg, | |
68 LogCallback *logger) : // logger may be nullptr for cerr | |
69 m_logger(logger), | |
67 m_completenessChecker(0), | 70 m_completenessChecker(0), |
68 m_crashed(false) { | 71 m_crashed(false) { |
69 | 72 |
70 m_process = new QProcess(); | 73 m_process = new QProcess(); |
71 m_process->setReadChannel(QProcess::StandardOutput); | 74 m_process->setReadChannel(QProcess::StandardOutput); |
76 | 79 |
77 if (!m_process->waitForStarted()) { | 80 if (!m_process->waitForStarted()) { |
78 if (m_process->state() == QProcess::NotRunning) { | 81 if (m_process->state() == QProcess::NotRunning) { |
79 QProcess::ProcessError err = m_process->error(); | 82 QProcess::ProcessError err = m_process->error(); |
80 if (err == QProcess::FailedToStart) { | 83 if (err == QProcess::FailedToStart) { |
81 std::cerr << "Unable to start server process " | 84 log("Unable to start server process " + processName); |
82 << processName << std::endl; | |
83 } else if (err == QProcess::Crashed) { | 85 } else if (err == QProcess::Crashed) { |
84 std::cerr << "Server process " << processName | 86 log("Server process " + processName + " crashed on startup"); |
85 << " crashed on startup" << std::endl; | |
86 } else { | 87 } else { |
87 std::cerr << "Server process " << processName | 88 QString e = QString("%1").arg(err); |
88 << " failed on startup with error code " | 89 log("Server process " + processName + |
89 << err << std::endl; | 90 " failed on startup with error code " + e.toStdString()); |
90 } | 91 } |
91 delete m_process; | 92 delete m_process; |
92 m_process = nullptr; | 93 m_process = nullptr; |
93 } | 94 } |
95 } | |
96 | |
97 if (m_process) { | |
98 log("Server process " + processName + " started OK"); | |
94 } | 99 } |
95 } | 100 } |
96 | 101 |
97 ~ProcessQtTransport() { | 102 ~ProcessQtTransport() { |
98 if (m_process) { | 103 if (m_process) { |
99 if (m_process->state() != QProcess::NotRunning) { | 104 if (m_process->state() != QProcess::NotRunning) { |
100 m_process->closeWriteChannel(); | 105 m_process->closeWriteChannel(); |
101 m_process->waitForFinished(200); | 106 m_process->waitForFinished(200); |
102 m_process->close(); | 107 m_process->close(); |
103 m_process->waitForFinished(); | 108 m_process->waitForFinished(); |
104 #ifdef DEBUG_TRANSPORT | 109 log("Server process exited normally"); |
105 std::cerr << "server exited" << std::endl; | |
106 #endif | |
107 } | 110 } |
108 delete m_process; | 111 delete m_process; |
109 } | 112 } |
110 } | 113 } |
111 | 114 |
118 isOK() const override { | 121 isOK() const override { |
119 return (m_process != nullptr) && !m_crashed; | 122 return (m_process != nullptr) && !m_crashed; |
120 } | 123 } |
121 | 124 |
122 std::vector<char> | 125 std::vector<char> |
123 call(const char *ptr, size_t size, bool slow) override { | 126 call(const char *ptr, size_t size, std::string type, bool slow) override { |
124 | 127 |
125 QMutexLocker locker(&m_mutex); | 128 QMutexLocker locker(&m_mutex); |
126 | 129 |
127 if (!m_completenessChecker) { | 130 if (!m_completenessChecker) { |
131 log("call: No completeness checker set on transport"); | |
128 throw std::logic_error("No completeness checker set on transport"); | 132 throw std::logic_error("No completeness checker set on transport"); |
129 } | 133 } |
130 if (!isOK()) { | 134 if (!isOK()) { |
135 log("call: Transport is not OK"); | |
131 throw std::logic_error("Transport is not OK"); | 136 throw std::logic_error("Transport is not OK"); |
132 } | 137 } |
133 | 138 |
134 #ifdef DEBUG_TRANSPORT | 139 #ifdef DEBUG_TRANSPORT |
135 std::cerr << "writing " << size << " bytes to server" << std::endl; | 140 std::cerr << "writing " << size << " bytes to server" << std::endl; |
167 if (m_process->state() == QProcess::NotRunning && | 172 if (m_process->state() == QProcess::NotRunning && |
168 // don't give up until we've read all that's been buffered! | 173 // don't give up until we've read all that's been buffered! |
169 !m_process->bytesAvailable()) { | 174 !m_process->bytesAvailable()) { |
170 QProcess::ProcessError err = m_process->error(); | 175 QProcess::ProcessError err = m_process->error(); |
171 if (err == QProcess::Crashed) { | 176 if (err == QProcess::Crashed) { |
172 std::cerr << "Server crashed during request" << std::endl; | 177 log("Server crashed during " + type + " request"); |
173 } else { | 178 } else { |
174 std::cerr << "Server failed during request with error code " | 179 QString e = QString("%1").arg(err); |
175 << err << std::endl; | 180 log("Server failed during " + type |
181 + " request with error code " + e.toStdString()); | |
176 } | 182 } |
177 m_crashed = true; | 183 m_crashed = true; |
178 throw ServerCrashed(); | 184 throw ServerCrashed(); |
179 } | 185 } |
180 } else { | 186 } else { |
187 | 193 |
188 return buffer; | 194 return buffer; |
189 } | 195 } |
190 | 196 |
191 private: | 197 private: |
198 LogCallback *m_logger; | |
192 MessageCompletenessChecker *m_completenessChecker; //!!! I don't own this (currently) | 199 MessageCompletenessChecker *m_completenessChecker; //!!! I don't own this (currently) |
193 QProcess *m_process; // I own this | 200 QProcess *m_process; // I own this |
194 QMutex m_mutex; | 201 QMutex m_mutex; |
195 bool m_crashed; | 202 bool m_crashed; |
203 | |
204 void log(std::string message) const { | |
205 if (m_logger) m_logger->log(message); | |
206 else std::cerr << message << std::endl; | |
207 } | |
196 }; | 208 }; |
197 | 209 |
198 } | 210 } |
199 } | 211 } |
200 | 212 |