aboutsummaryrefslogtreecommitdiffstats
path: root/fnet
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-12-04 10:00:19 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-12-04 10:00:19 +0000
commitc9927dcd8cb63ce2ed6e1c35d851f687c0fe764c (patch)
tree3bfb378327d0cb1d2f6c213862ea74c9145b6478 /fnet
parent4c1c88213709ca0bd17cc2dd91db0e313724b4e8 (diff)
Separate loks so the same lock is not used for multiple things.
Diffstat (limited to 'fnet')
-rw-r--r--fnet/src/vespa/fnet/transport_thread.cpp21
-rw-r--r--fnet/src/vespa/fnet/transport_thread.h7
2 files changed, 11 insertions, 17 deletions
diff --git a/fnet/src/vespa/fnet/transport_thread.cpp b/fnet/src/vespa/fnet/transport_thread.cpp
index 41906a7550d..9758cff21e4 100644
--- a/fnet/src/vespa/fnet/transport_thread.cpp
+++ b/fnet/src/vespa/fnet/transport_thread.cpp
@@ -116,7 +116,7 @@ FNET_TransportThread::PostEvent(FNET_ControlPacket *cpacket,
{
size_t qLen;
{
- std::unique_lock<std::mutex> guard(_lock);
+ std::unique_lock<std::mutex> guard(_qLock);
if (IsShutDown()) {
guard.unlock();
SafeDiscardEvent(cpacket, context);
@@ -217,6 +217,7 @@ FNET_TransportThread::FNET_TransportThread(FNET_Transport &owner_in)
_selector(),
_queue(),
_myQueue(),
+ _qLock(),
_lock(),
_cond(),
_pseudo_thread(),
@@ -234,7 +235,7 @@ FNET_TransportThread::~FNET_TransportThread()
{
std::lock_guard<std::mutex> guard(_lock);
}
- if (_started && !_finished) {
+ if (_started.load(std::memory_order_relaxed) && !_finished) {
LOG(error, "Transport: delete called on active object!");
} else {
std::lock_guard guard(_pseudo_thread);
@@ -354,7 +355,7 @@ FNET_TransportThread::ShutDown(bool waitFinished)
{
bool wasEmpty = false;
{
- std::lock_guard<std::mutex> guard(_lock);
+ std::lock_guard<std::mutex> guard(_qLock);
if (!IsShutDown()) {
_shutdown.store(true, std::memory_order_relaxed);
wasEmpty = _queue.IsEmpty_NoLock();
@@ -385,15 +386,7 @@ FNET_TransportThread::WaitFinished()
bool
FNET_TransportThread::InitEventLoop()
{
- bool wasStarted;
- {
- std::lock_guard<std::mutex> guard(_lock);
- wasStarted = _started;
- if (!_started) {
- _started = true;
- }
- }
- if (wasStarted) {
+ if (_started.exchange(true)) {
LOG(error, "Transport: InitEventLoop: object already active!");
return false;
}
@@ -405,7 +398,7 @@ void
FNET_TransportThread::handle_wakeup_events()
{
{
- std::lock_guard<std::mutex> guard(_lock);
+ std::lock_guard<std::mutex> guard(_qLock);
_queue.FlushPackets_NoLock(&_myQueue);
}
@@ -523,7 +516,7 @@ void
FNET_TransportThread::endEventLoop() {
// flush event queue
{
- std::lock_guard<std::mutex> guard(_lock);
+ std::lock_guard<std::mutex> guard(_qLock);
_queue.FlushPackets_NoLock(&_myQueue);
}
diff --git a/fnet/src/vespa/fnet/transport_thread.h b/fnet/src/vespa/fnet/transport_thread.h
index 83332fb4cc8..aa03c8d300e 100644
--- a/fnet/src/vespa/fnet/transport_thread.h
+++ b/fnet/src/vespa/fnet/transport_thread.h
@@ -43,10 +43,11 @@ private:
Selector _selector; // I/O event generator
FNET_PacketQueue_NoLock _queue; // outer event queue
FNET_PacketQueue_NoLock _myQueue; // inner event queue
- std::mutex _lock; // used for synchronization
- std::condition_variable _cond; // used for synchronization
+ std::mutex _qLock; // protects the Q
+ std::mutex _lock; // used for synchronization during shutdown
+ std::condition_variable _cond; // used for synchronization during shutdown
std::recursive_mutex _pseudo_thread; // used after transport thread has shut down
- bool _started; // event loop started ?
+ std::atomic<bool> _started; // event loop started ?
std::atomic<bool> _shutdown; // should stop event loop ?
bool _finished; // event loop stopped ?
bool _waitFinished; // someone is waiting for _finished