ExternalCommandListener: Use threads per client connection

fixes #6589
This commit is contained in:
Michael Friedrich 2014-08-05 18:01:01 +02:00
parent 008f5803e7
commit 963125f746
2 changed files with 54 additions and 40 deletions

View File

@ -99,6 +99,7 @@ void ExternalCommandListener::CommandPipeThread(const String& commandPath)
for (;;) { for (;;) {
int fd; int fd;
try {
do { do {
fd = open(commandPath.CStr(), O_RDONLY); fd = open(commandPath.CStr(), O_RDONLY);
} while (fd < 0 && errno == EINTR); } while (fd < 0 && errno == EINTR);
@ -110,6 +111,18 @@ void ExternalCommandListener::CommandPipeThread(const String& commandPath)
return; return;
} }
Log(LogNotice, "ExternalCommandListener", "Client connected");
Utility::QueueAsyncCallback(boost::bind(&ExternalCommandListener::ClientHandler, this, commandPath, fd));
} catch (std::exception&) {
Log(LogCritical, "ExternalCommandListener", "Cannot accept new connection.");
}
}
}
void ExternalCommandListener::ClientHandler(const String& commandPath, int fd)
{
FILE *fp = fdopen(fd, "r"); FILE *fp = fdopen(fd, "r");
if (fp == NULL) { if (fp == NULL) {
@ -127,6 +140,7 @@ void ExternalCommandListener::CommandPipeThread(const String& commandPath)
while (strlen(line) > 0 && while (strlen(line) > 0 &&
(line[strlen(line) - 1] == '\r' || line[strlen(line) - 1] == '\n')) (line[strlen(line) - 1] == '\r' || line[strlen(line) - 1] == '\n'))
line[strlen(line) - 1] = '\0'; line[strlen(line) - 1] = '\0';
}
String command = line; String command = line;
@ -138,11 +152,10 @@ void ExternalCommandListener::CommandPipeThread(const String& commandPath)
std::ostringstream msgbuf; std::ostringstream msgbuf;
msgbuf << "External command failed."; msgbuf << "External command failed.";
Log(LogWarning, "ExternalCommandListener", msgbuf.str()); Log(LogWarning, "ExternalCommandListener", msgbuf.str());
} return;
} }
delete line; delete line;
fclose(fp); fclose(fp);
} }
}
#endif /* _WIN32 */ #endif /* _WIN32 */

View File

@ -49,6 +49,7 @@ private:
boost::thread m_CommandThread; boost::thread m_CommandThread;
void CommandPipeThread(const String& commandPath); void CommandPipeThread(const String& commandPath);
void ClientHandler(const String& commandPath, int fd);
#endif /* _WIN32 */ #endif /* _WIN32 */
}; };