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