1
0
Fork 0

make sure task is not destroyed during setup

This commit is contained in:
Frank Celler 2015-04-04 22:11:06 +02:00
parent 178e77bc5d
commit bf6abbea7f
3 changed files with 32 additions and 3 deletions

View File

@ -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);

View File

@ -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<bool> _setupDone;
};
}
}

View File

@ -346,12 +346,16 @@ 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
if (res == TRI_ERROR_NO_ERROR) {
registerChunkedTask(task, n);
}
task->setupDone();
}
////////////////////////////////////////////////////////////////////////////////
/// @brief handles a connection close
////////////////////////////////////////////////////////////////////////////////