1
0
Fork 0

move away from mutex to atomic variables

This commit is contained in:
Jan Steemann 2015-11-05 10:58:35 +01:00
parent 790dae1c52
commit dc53e9fe95
3 changed files with 21 additions and 78 deletions

View File

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

View File

@ -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
// ...........................................................................

View File

@ -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
////////////////////////////////////////////////////////////////////////////////