Track writer request id
This commit is contained in:
		
					parent
					
						
							
								f2cf82bccd
							
						
					
				
			
			
				commit
				
					
						68d6c44e06
					
				
			
		
					 2 changed files with 17 additions and 11 deletions
				
			
		| 
						 | 
					@ -66,7 +66,9 @@ nano::store::write_guard nano::store::write_queue::wait (writer writer)
 | 
				
			||||||
bool nano::store::write_queue::contains (writer writer) const
 | 
					bool nano::store::write_queue::contains (writer writer) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	nano::lock_guard<nano::mutex> guard{ mutex };
 | 
						nano::lock_guard<nano::mutex> guard{ mutex };
 | 
				
			||||||
	return std::find (queue.cbegin (), queue.cend (), writer) != queue.cend ();
 | 
						return std::any_of (queue.cbegin (), queue.cend (), [writer] (auto const & item) {
 | 
				
			||||||
 | 
							return item.first == writer;
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void nano::store::write_queue::pop ()
 | 
					void nano::store::write_queue::pop ()
 | 
				
			||||||
| 
						 | 
					@ -83,17 +85,19 @@ void nano::store::write_queue::acquire (writer writer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	nano::unique_lock<nano::mutex> lock{ mutex };
 | 
						nano::unique_lock<nano::mutex> lock{ mutex };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// There should be no duplicates in the queue
 | 
						// There should be no duplicates in the queue (exception is testing)
 | 
				
			||||||
	debug_assert (std::none_of (queue.cbegin (), queue.cend (), [writer] (auto const & item) { return item == writer; }));
 | 
						debug_assert (std::none_of (queue.cbegin (), queue.cend (), [writer] (auto const & item) {
 | 
				
			||||||
 | 
							return item.first == writer;
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						|| writer == writer::testing);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto const id = next++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Add writer to the end of the queue if it's not already waiting
 | 
						// Add writer to the end of the queue if it's not already waiting
 | 
				
			||||||
	auto exists = std::find (queue.cbegin (), queue.cend (), writer) != queue.cend ();
 | 
						queue.push_back ({ writer, id });
 | 
				
			||||||
	if (!exists)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		queue.push_back (writer);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	condition.wait (lock, [&] () { return queue.front () == writer; });
 | 
						// Wait until we are at the front of the queue
 | 
				
			||||||
 | 
						condition.wait (lock, [&] () { return queue.front ().second == id; });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void nano::store::write_queue::release (writer writer)
 | 
					void nano::store::write_queue::release (writer writer)
 | 
				
			||||||
| 
						 | 
					@ -101,7 +105,7 @@ void nano::store::write_queue::release (writer writer)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		nano::lock_guard<nano::mutex> guard{ mutex };
 | 
							nano::lock_guard<nano::mutex> guard{ mutex };
 | 
				
			||||||
		release_assert (!queue.empty ());
 | 
							release_assert (!queue.empty ());
 | 
				
			||||||
		release_assert (queue.front () == writer);
 | 
							release_assert (queue.front ().first == writer);
 | 
				
			||||||
		queue.pop_front ();
 | 
							queue.pop_front ();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	condition.notify_all ();
 | 
						condition.notify_all ();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,7 +70,9 @@ private:
 | 
				
			||||||
	void release (writer writer);
 | 
						void release (writer writer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	std::deque<writer> queue;
 | 
						uint64_t next{ 0 };
 | 
				
			||||||
 | 
						using entry = std::pair<writer, uint64_t>; // uint64_t is a unique id for each write_guard
 | 
				
			||||||
 | 
						std::deque<entry> queue;
 | 
				
			||||||
	mutable nano::mutex mutex;
 | 
						mutable nano::mutex mutex;
 | 
				
			||||||
	nano::condition_variable condition;
 | 
						nano::condition_variable condition;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue