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