mirror of https://gitee.com/bigwinds/arangodb
move away from mutex to atomic variables
This commit is contained in:
parent
790dae1c52
commit
dc53e9fe95
|
@ -123,6 +123,7 @@ TRI_document_collection_t::TRI_document_collection_t ()
|
|||
_headersPtr(nullptr),
|
||||
_keyGenerator(nullptr),
|
||||
_uncollectedLogfileEntries(0),
|
||||
_currentWriterThread(0),
|
||||
_cleanupIndexes(0) {
|
||||
|
||||
_tickMax = 0;
|
||||
|
@ -199,13 +200,8 @@ int TRI_document_collection_t::beginWrite () {
|
|||
// std::cout << "BeginWrite: " << document->_info._name << std::endl;
|
||||
TRI_WRITE_LOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
||||
|
||||
try {
|
||||
_vocbase->_deadlockDetector.setWriterStarted(this);
|
||||
}
|
||||
catch (...) {
|
||||
TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
||||
return TRI_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
// register writer
|
||||
_currentWriterThread.store(TRI_CurrentThreadId());
|
||||
|
||||
return TRI_ERROR_NO_ERROR;
|
||||
}
|
||||
|
@ -229,11 +225,8 @@ int TRI_document_collection_t::endWrite () {
|
|||
// std::cout << "EndWrite: " << document->_info._name << std::endl;
|
||||
TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
||||
|
||||
try {
|
||||
_vocbase->_deadlockDetector.setWriterFinished(this);
|
||||
}
|
||||
catch (...) {
|
||||
}
|
||||
// unregister writer
|
||||
_currentWriterThread.store(0);
|
||||
|
||||
return TRI_ERROR_NO_ERROR;
|
||||
}
|
||||
|
@ -390,14 +383,9 @@ int TRI_document_collection_t::beginWriteTimed (uint64_t timeout,
|
|||
if (wasBlocked) {
|
||||
_vocbase->_deadlockDetector.setReaderUnblocked(this);
|
||||
}
|
||||
|
||||
try {
|
||||
_vocbase->_deadlockDetector.setWriterStarted(this);
|
||||
}
|
||||
catch (...) {
|
||||
TRI_WRITE_UNLOCK_DOCUMENTS_INDEXES_PRIMARY_COLLECTION(this);
|
||||
return TRI_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
// register writer
|
||||
_currentWriterThread.store(TRI_CurrentThreadId());
|
||||
|
||||
return TRI_ERROR_NO_ERROR;
|
||||
}
|
||||
|
|
|
@ -357,6 +357,7 @@ TRI_doc_collection_info_t;
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct TRI_document_collection_t : public TRI_collection_t {
|
||||
|
||||
// ...........................................................................
|
||||
// this lock protects the indexes and _headers attributes
|
||||
// ...........................................................................
|
||||
|
@ -380,6 +381,10 @@ public:
|
|||
VocShaper* getShaper () const;
|
||||
#endif
|
||||
|
||||
inline TRI_tid_t getCurrentWriterThread () const {
|
||||
return _currentWriterThread.load();
|
||||
}
|
||||
|
||||
inline bool useSecondaryIndexes () const {
|
||||
return _useSecondaryIndexes;
|
||||
}
|
||||
|
@ -421,6 +426,8 @@ public:
|
|||
TRI_read_write_lock_t _compactionLock;
|
||||
double _lastCompaction;
|
||||
|
||||
std::atomic<TRI_tid_t> _currentWriterThread;
|
||||
|
||||
// ...........................................................................
|
||||
// this condition variable protects the _journalsCondition
|
||||
// ...........................................................................
|
||||
|
|
|
@ -69,18 +69,10 @@ namespace triagens {
|
|||
|
||||
std::vector<TRI_tid_t> stack;
|
||||
|
||||
TRI_tid_t writerTid;
|
||||
TRI_tid_t writerTid = value->getCurrentWriterThread();
|
||||
|
||||
{
|
||||
MUTEX_LOCKER(_writersLock);
|
||||
// find responsible writer
|
||||
auto it = _writers.find(value);
|
||||
|
||||
if (it == _writers.end()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
writerTid = (*it).second;
|
||||
if (writerTid == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
stack.push_back(writerTid);
|
||||
|
@ -121,18 +113,10 @@ namespace triagens {
|
|||
|
||||
std::vector<TRI_tid_t> stack;
|
||||
|
||||
TRI_tid_t writerTid;
|
||||
TRI_tid_t writerTid = value->getCurrentWriterThread();
|
||||
|
||||
{
|
||||
MUTEX_LOCKER(_writersLock);
|
||||
// find responsible writer
|
||||
auto it = _writers.find(value);
|
||||
|
||||
if (it == _writers.end()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
writerTid = (*it).second;
|
||||
if (writerTid == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
stack.push_back(writerTid);
|
||||
|
@ -186,48 +170,12 @@ namespace triagens {
|
|||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief inserts a writer into the list of writers
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void setWriterStarted (T const* value) {
|
||||
auto tid = TRI_CurrentThreadId();
|
||||
|
||||
MUTEX_LOCKER(_writersLock);
|
||||
_writers.emplace(value, tid);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief removes a writers from the list of writers
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void setWriterFinished (T const* value) noexcept {
|
||||
try {
|
||||
MUTEX_LOCKER(_writersLock);
|
||||
_writers.erase(value);
|
||||
}
|
||||
catch (...) {
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- private variables
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
private:
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief lock for managing the writers
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
triagens::basics::Mutex _writersLock;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief all operating writers
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::unordered_map<T const*, TRI_tid_t> _writers;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief lock for managing the readers
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
Loading…
Reference in New Issue