Mercurial > hg > svcore
comparison base/Serialiser.cpp @ 1857:14c776dad920
Make Serialiser cancellable while waiting for its lock
author | Chris Cannam |
---|---|
date | Thu, 14 May 2020 16:35:39 +0100 |
parents | d095214ffbaf |
children |
comparison
equal
deleted
inserted
replaced
1856:ecd3152750a5 | 1857:14c776dad920 |
---|---|
12 License, or (at your option) any later version. See the file | 12 License, or (at your option) any later version. See the file |
13 COPYING included with this distribution for more information. | 13 COPYING included with this distribution for more information. |
14 */ | 14 */ |
15 | 15 |
16 #include "Serialiser.h" | 16 #include "Serialiser.h" |
17 #include "Debug.h" | |
17 | 18 |
18 #include <iostream> | 19 #include <iostream> |
19 | 20 |
20 QMutex | 21 QMutex |
21 Serialiser::m_mapMutex; | 22 Serialiser::m_mapMutex; |
22 | 23 |
23 std::map<QString, QMutex *> | 24 std::map<QString, QMutex *> |
24 Serialiser::m_mutexMap; | 25 Serialiser::m_mutexMap; |
25 | 26 |
26 Serialiser::Serialiser(QString id) : | 27 Serialiser::Serialiser(QString id) : |
27 m_id(id) | 28 Serialiser(id, nullptr) { } |
29 | |
30 Serialiser::Serialiser(QString id, const std::atomic<bool> *cancelled) : | |
31 m_id(id), | |
32 m_cancelled(cancelled), | |
33 m_locked(false) | |
28 { | 34 { |
29 m_mapMutex.lock(); | 35 m_mapMutex.lock(); |
30 | 36 |
31 if (m_mutexMap.find(m_id) == m_mutexMap.end()) { | 37 if (m_mutexMap.find(m_id) == m_mutexMap.end()) { |
32 m_mutexMap[m_id] = new QMutex; | 38 m_mutexMap[m_id] = new QMutex; |
41 | 47 |
42 QMutex *idMutex = m_mutexMap[m_id]; | 48 QMutex *idMutex = m_mutexMap[m_id]; |
43 | 49 |
44 m_mapMutex.unlock(); | 50 m_mapMutex.unlock(); |
45 | 51 |
46 idMutex->lock(); | 52 if (!m_cancelled) { |
53 idMutex->lock(); | |
54 m_locked = true; | |
55 } else { | |
56 // try to lock, polling the cancelled status occasionally | |
57 while (!m_locked && ! *m_cancelled) { | |
58 m_locked = idMutex->tryLock(500); | |
59 if (*m_cancelled) { | |
60 SVCERR << "Serialiser: cancelled!" << endl; | |
61 } | |
62 } | |
63 } | |
47 } | 64 } |
48 | 65 |
49 Serialiser::~Serialiser() | 66 Serialiser::~Serialiser() |
50 { | 67 { |
51 m_mapMutex.lock(); | 68 m_mapMutex.lock(); |
52 | 69 |
53 m_mutexMap[m_id]->unlock(); | 70 if (m_locked) { |
71 m_mutexMap[m_id]->unlock(); | |
72 } | |
54 | 73 |
55 m_mapMutex.unlock(); | 74 m_mapMutex.unlock(); |
56 } | 75 } |
57 | 76 |
58 | 77 |