mirror of https://gitee.com/bigwinds/arangodb
make sure task is not destroyed during setup
This commit is contained in:
parent
178e77bc5d
commit
bf6abbea7f
|
@ -177,7 +177,8 @@ HttpCommTask::HttpCommTask (HttpServer* server,
|
||||||
_sinceCompactification(0),
|
_sinceCompactification(0),
|
||||||
_originalBodyLength(0),
|
_originalBodyLength(0),
|
||||||
_isChunked(false),
|
_isChunked(false),
|
||||||
_chunkedTask(this) {
|
_chunkedTask(this),
|
||||||
|
_setupDone(false) {
|
||||||
LOG_TRACE(
|
LOG_TRACE(
|
||||||
"connection established, client %d, server ip %s, server port %d, client ip %s, client port %d",
|
"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),
|
(int) TRI_get_fd_or_handle_of_socket(socket),
|
||||||
|
@ -710,6 +711,14 @@ void HttpCommTask::finishedChunked () {
|
||||||
processRead();
|
processRead();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief task set up complete
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void HttpCommTask::setupDone () {
|
||||||
|
_setupDone.store(true, std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- protected methods
|
// --SECTION-- protected methods
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -1172,6 +1181,10 @@ bool HttpCommTask::handleAsync () {
|
||||||
bool HttpCommTask::handleRead (bool& closed) {
|
bool HttpCommTask::handleRead (bool& closed) {
|
||||||
bool res = true;
|
bool res = true;
|
||||||
|
|
||||||
|
if (! _setupDone.load(std::memory_order_relaxed)) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
if (! _closeRequested) {
|
if (! _closeRequested) {
|
||||||
res = fillReadBuffer(closed);
|
res = fillReadBuffer(closed);
|
||||||
|
|
||||||
|
|
|
@ -143,6 +143,12 @@ namespace triagens {
|
||||||
|
|
||||||
void finishedChunked ();
|
void finishedChunked ();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief task set up complete
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void setupDone ();
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- private methods
|
// --SECTION-- private methods
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -439,6 +445,12 @@ namespace triagens {
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
AsyncChunkedTask _chunkedTask;
|
AsyncChunkedTask _chunkedTask;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief task ready
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
std::atomic<bool> _setupDone;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
// registers the task and get the number of the scheduler thread
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
_scheduler->registerTask(task, &n);
|
int res = _scheduler->registerTask(task, &n);
|
||||||
|
|
||||||
// register the ChunkedTask in the same thread
|
// register the ChunkedTask in the same thread
|
||||||
registerChunkedTask(task, n);
|
if (res == TRI_ERROR_NO_ERROR) {
|
||||||
|
registerChunkedTask(task, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
task->setupDone();
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue