From bf6abbea7ffe8c52f155e2762753d8c97b48a00d Mon Sep 17 00:00:00 2001 From: Frank Celler Date: Sat, 4 Apr 2015 22:11:06 +0200 Subject: [PATCH] make sure task is not destroyed during setup --- lib/HttpServer/HttpCommTask.cpp | 15 ++++++++++++++- lib/HttpServer/HttpCommTask.h | 12 ++++++++++++ lib/HttpServer/HttpServer.cpp | 8 ++++++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/HttpServer/HttpCommTask.cpp b/lib/HttpServer/HttpCommTask.cpp index b737051dee..2471b10c58 100644 --- a/lib/HttpServer/HttpCommTask.cpp +++ b/lib/HttpServer/HttpCommTask.cpp @@ -177,7 +177,8 @@ HttpCommTask::HttpCommTask (HttpServer* server, _sinceCompactification(0), _originalBodyLength(0), _isChunked(false), - _chunkedTask(this) { + _chunkedTask(this), + _setupDone(false) { LOG_TRACE( "connection established, client %d, server ip %s, server port %d, client ip %s, client port %d", (int) TRI_get_fd_or_handle_of_socket(socket), @@ -710,6 +711,14 @@ void HttpCommTask::finishedChunked () { processRead(); } +//////////////////////////////////////////////////////////////////////////////// +/// @brief task set up complete +//////////////////////////////////////////////////////////////////////////////// + +void HttpCommTask::setupDone () { + _setupDone.store(true, std::memory_order_relaxed); +} + // ----------------------------------------------------------------------------- // --SECTION-- protected methods // ----------------------------------------------------------------------------- @@ -1172,6 +1181,10 @@ bool HttpCommTask::handleAsync () { bool HttpCommTask::handleRead (bool& closed) { bool res = true; + if (! _setupDone.load(std::memory_order_relaxed)) { + return res; + } + if (! _closeRequested) { res = fillReadBuffer(closed); diff --git a/lib/HttpServer/HttpCommTask.h b/lib/HttpServer/HttpCommTask.h index 5df3110fe1..4c16192a1b 100644 --- a/lib/HttpServer/HttpCommTask.h +++ b/lib/HttpServer/HttpCommTask.h @@ -143,6 +143,12 @@ namespace triagens { void finishedChunked (); +//////////////////////////////////////////////////////////////////////////////// +/// @brief task set up complete +//////////////////////////////////////////////////////////////////////////////// + + void setupDone (); + // ----------------------------------------------------------------------------- // --SECTION-- private methods // ----------------------------------------------------------------------------- @@ -439,6 +445,12 @@ namespace triagens { //////////////////////////////////////////////////////////////////////////////// AsyncChunkedTask _chunkedTask; + +//////////////////////////////////////////////////////////////////////////////// +/// @brief task ready +//////////////////////////////////////////////////////////////////////////////// + + std::atomic _setupDone; }; } } diff --git a/lib/HttpServer/HttpServer.cpp b/lib/HttpServer/HttpServer.cpp index 51aa613890..46ad4862e0 100644 --- a/lib/HttpServer/HttpServer.cpp +++ b/lib/HttpServer/HttpServer.cpp @@ -346,10 +346,14 @@ void HttpServer::handleConnected (TRI_socket_t s, const ConnectionInfo& info) { // registers the task and get the number of the scheduler thread ssize_t n; - _scheduler->registerTask(task, &n); + int res = _scheduler->registerTask(task, &n); // register the ChunkedTask in the same thread - registerChunkedTask(task, n); + if (res == TRI_ERROR_NO_ERROR) { + registerChunkedTask(task, n); + } + + task->setupDone(); } ////////////////////////////////////////////////////////////////////////////////