void run() override { #ifdef __linux if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>("lokit_connection"), 0, 0, 0) != 0) std::cout << Util::logPrefix() << "Cannot set thread name :" << strerror(errno) << std::endl; #endif try { // Open websocket connection between the child process and the // parent. The parent forwards us requests that it can't handle. HTTPClientSession cs("127.0.0.1", MASTER_PORT_NUMBER); cs.setTimeout(0); HTTPRequest request(HTTPRequest::HTTP_GET, CHILD_URI); HTTPResponse response; std::shared_ptr<WebSocket> ws(new WebSocket(cs, request, response)); _session.reset(new ChildProcessSession(ws, _loKit, _loKitDocument, std::to_string(_childId))); //std::shared_ptr<ChildProcessSession> session(new ChildProcessSession(ws, _loKit, _loKitDocument)); ws->setReceiveTimeout(0); // child Jail TID PID std::string hello("child " + std::to_string(_childId) + " " + _threadId + " " + std::to_string(Process::id())); _session->sendTextFrame(hello); TileQueue queue; Thread queueHandlerThread; QueueHandler handler(queue); handler.setSession(_session); queueHandlerThread.start(handler); int flags; int n; do { char buffer[1024]; n = ws->receiveFrame(buffer, sizeof(buffer), flags); if (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE) { std::string firstLine = getFirstLine(buffer, n); StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); // The only kind of messages a child process receives are the single-line ones (?) assert(firstLine.size() == static_cast<std::string::size_type>(n)); queue.put(firstLine); } } while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE); queue.clear(); queue.put("eof"); queueHandlerThread.join(); } catch (Exception& exc) { std::cout << Util::logPrefix() + "Exception: " + exc.what() << std::endl; } catch (std::exception& exc) { std::cout << Util::logPrefix() + "Exception: " + exc.what() << std::endl; } }
void run() override { static const std::string thread_name = "kit_ws_" + _sessionId; #ifdef __linux if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(thread_name.c_str()), 0, 0, 0) != 0) Log::error("Cannot set thread name to " + thread_name + "."); #endif Log::debug("Thread [" + thread_name + "] started."); try { // Open websocket connection between the child process and the // parent. The parent forwards us requests that it can't handle. HTTPClientSession cs("127.0.0.1", MASTER_PORT_NUMBER); cs.setTimeout(0); HTTPRequest request(HTTPRequest::HTTP_GET, CHILD_URI + _sessionId); HTTPResponse response; _ws = std::make_shared<WebSocket>(cs, request, response); _session.reset(new ChildProcessSession(_sessionId, _ws, _loKit, _loKitDocument, _jailId, _onLoad, _onUnload)); _ws->setReceiveTimeout(0); // child Jail TID PID std::string hello("child " + _jailId + " " + _sessionId + " " + std::to_string(Process::id())); _session->sendTextFrame(hello); TileQueue queue; QueueHandler handler(queue, _session, "kit_queue_" + _session->getId()); Thread queueHandlerThread; queueHandlerThread.start(handler); int flags; int n; do { char buffer[1024]; n = _ws->receiveFrame(buffer, sizeof(buffer), flags); if (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE) { std::string firstLine = getFirstLine(buffer, n); if (firstLine == "eof") break; StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); // The only kind of messages a child process receives are the single-line ones (?) assert(firstLine.size() == static_cast<std::string::size_type>(n)); queue.put(firstLine); } } while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE && !_stop); queue.clear(); queue.put("eof"); queueHandlerThread.join(); // We should probably send the Client some sensible message and reason. _session->sendTextFrame("eof"); _session.reset(); } catch (const Exception& exc) { Log::error() << "Error: " << exc.displayText() << (exc.nested() ? " (" + exc.nested()->displayText() + ")" : "") << Log::end; } catch (const std::exception& exc) { Log::error(std::string("Exception: ") + exc.what()); } catch (...) { Log::error("Unexpected Exception."); } Log::debug("Thread [" + thread_name + "] finished."); }