I can't because I unlock a lockRead and not a lockWrite
@@ -68,10 +68,6 public: | |||
|
68 | 68 | */ |
|
69 | 69 | void deleteVariables(const QVector<std::shared_ptr<Variable> > &variables) noexcept; |
|
70 | 70 | |
|
71 | /** | |
|
72 | * @brief abort the variable retrieve data progression | |
|
73 | */ | |
|
74 | void abortProgress(std::shared_ptr<Variable> variable); | |
|
75 | 71 | |
|
76 | 72 | static AcquisitionZoomType getZoomType(const SqpRange &range, const SqpRange &oldRange); |
|
77 | 73 | signals: |
@@ -18,7 +18,10 Q_LOGGING_CATEGORY(LOG_VariableAcquisitionWorker, "VariableAcquisitionWorker") | |||
|
18 | 18 | |
|
19 | 19 | struct VariableAcquisitionWorker::VariableAcquisitionWorkerPrivate { |
|
20 | 20 | |
|
21 |
explicit VariableAcquisitionWorkerPrivate() |
|
|
21 | explicit VariableAcquisitionWorkerPrivate(VariableAcquisitionWorker *parent) | |
|
22 | : m_Lock{QReadWriteLock::Recursive}, q{parent} | |
|
23 | { | |
|
24 | } | |
|
22 | 25 | |
|
23 | 26 | void lockRead() { m_Lock.lockForRead(); } |
|
24 | 27 | void lockWrite() { m_Lock.lockForWrite(); } |
@@ -26,17 +29,21 struct VariableAcquisitionWorker::VariableAcquisitionWorkerPrivate { | |||
|
26 | 29 | |
|
27 | 30 | void removeVariableRequest(QUuid vIdentifier); |
|
28 | 31 | |
|
32 | /// Remove the current request and execute the next one if exist | |
|
33 | void updateToNextRequest(QUuid vIdentifier); | |
|
34 | ||
|
29 | 35 | QMutex m_WorkingMutex; |
|
30 | 36 | QReadWriteLock m_Lock; |
|
31 | 37 | |
|
32 | 38 | std::map<QUuid, QVector<AcquisitionDataPacket> > m_AcqIdentifierToAcqDataPacketVectorMap; |
|
33 | 39 | std::map<QUuid, AcquisitionRequest> m_AcqIdentifierToAcqRequestMap; |
|
34 | 40 | std::map<QUuid, std::pair<QUuid, QUuid> > m_VIdentifierToCurrrentAcqIdNextIdPairMap; |
|
41 | VariableAcquisitionWorker *q; | |
|
35 | 42 | }; |
|
36 | 43 | |
|
37 | 44 | |
|
38 | 45 | VariableAcquisitionWorker::VariableAcquisitionWorker(QObject *parent) |
|
39 | : QObject{parent}, impl{spimpl::make_unique_impl<VariableAcquisitionWorkerPrivate>()} | |
|
46 | : QObject{parent}, impl{spimpl::make_unique_impl<VariableAcquisitionWorkerPrivate>(this)} | |
|
40 | 47 | { |
|
41 | 48 | } |
|
42 | 49 | |
@@ -103,6 +110,35 QUuid VariableAcquisitionWorker::pushVariableRequest(QUuid varRequestId, QUuid v | |||
|
103 | 110 | void VariableAcquisitionWorker::abortProgressRequested(QUuid vIdentifier) |
|
104 | 111 | { |
|
105 | 112 | // TODO |
|
113 | impl->lockRead(); | |
|
114 | ||
|
115 | auto it = impl->m_VIdentifierToCurrrentAcqIdNextIdPairMap.find(vIdentifier); | |
|
116 | if (it != impl->m_VIdentifierToCurrrentAcqIdNextIdPairMap.cend()) { | |
|
117 | auto currentAcqId = it->second.first; | |
|
118 | ||
|
119 | auto it = impl->m_AcqIdentifierToAcqRequestMap.find(currentAcqId); | |
|
120 | if (it != impl->m_AcqIdentifierToAcqRequestMap.cend()) { | |
|
121 | auto request = it->second; | |
|
122 | impl->unlock(); | |
|
123 | ||
|
124 | // Remove the current request from the worker | |
|
125 | ||
|
126 | impl->lockWrite(); | |
|
127 |
impl->updateToNextRequest(vIdentifier);
|
|
|
128 | impl->unlock(); | |
|
129 | ||
|
130 | // notify the request aborting to the provider | |
|
131 | request.m_Provider->requestDataAborting(currentAcqId); | |
|
132 | } | |
|
133 | else { | |
|
134 | impl->unlock(); | |
|
135 | qCWarning(LOG_VariableAcquisitionWorker()) | |
|
136 | << tr("Impossible to abort an unknown acquisition request") << currentAcqId; | |
|
137 | } | |
|
138 | } | |
|
139 | else { | |
|
140 | impl->unlock(); | |
|
141 | } | |
|
106 | 142 | } |
|
107 | 143 | |
|
108 | 144 | void VariableAcquisitionWorker::onVariableRetrieveDataInProgress(QUuid acqIdentifier, |
@@ -196,8 +232,8 void VariableAcquisitionWorker::onVariableDataAcquired(QUuid acqIdentifier, | |||
|
196 | 232 | } |
|
197 | 233 | } |
|
198 | 234 | else { |
|
199 |
qC |
|
|
200 | << tr("Impossible to retrieve AcquisitionRequest for the incoming data"); | |
|
235 | qCWarning(LOG_VariableAcquisitionWorker()) | |
|
236 | << tr("Impossible to retrieve AcquisitionRequest for the incoming data."); | |
|
201 | 237 | } |
|
202 | 238 | impl->unlock(); |
|
203 | 239 | } |
@@ -255,3 +291,31 void VariableAcquisitionWorker::VariableAcquisitionWorkerPrivate::removeVariable | |||
|
255 | 291 | m_VIdentifierToCurrrentAcqIdNextIdPairMap.erase(vIdentifier); |
|
256 | 292 | unlock(); |
|
257 | 293 | } |
|
294 | ||
|
295 | void VariableAcquisitionWorker::VariableAcquisitionWorkerPrivate::updateToNextRequest( | |
|
296 | QUuid vIdentifier) | |
|
297 | { | |
|
298 | auto it = m_VIdentifierToCurrrentAcqIdNextIdPairMap.find(vIdentifier); | |
|
299 | if (it != m_VIdentifierToCurrrentAcqIdNextIdPairMap.cend()) { | |
|
300 | if (it->second.second.isNull()) { | |
|
301 | // There is no next request, we can remove the variable request | |
|
302 | removeVariableRequest(vIdentifier); | |
|
303 | } | |
|
304 | else { | |
|
305 | auto acqIdentifierToRemove = it->second.first; | |
|
306 | // Move the next request to the current request | |
|
307 | it->second.first = it->second.second; | |
|
308 | it->second.second = QUuid(); | |
|
309 | // Remove AcquisitionRequest and results; | |
|
310 | m_AcqIdentifierToAcqRequestMap.erase(acqIdentifierToRemove); | |
|
311 | m_AcqIdentifierToAcqDataPacketVectorMap.erase(acqIdentifierToRemove); | |
|
312 | // Execute the current request | |
|
313 | QMetaObject::invokeMethod(q, "onExecuteRequest", Qt::QueuedConnection, | |
|
314 | Q_ARG(QUuid, it->second.first)); | |
|
315 | } | |
|
316 | } | |
|
317 | else { | |
|
318 | qCCritical(LOG_VariableAcquisitionWorker()) | |
|
319 | << tr("Impossible to execute the acquisition on an unfound variable "); | |
|
320 | } | |
|
321 | } |
@@ -253,10 +253,6 void VariableController::deleteVariables( | |||
|
253 | 253 | } |
|
254 | 254 | } |
|
255 | 255 | |
|
256 | void VariableController::abortProgress(std::shared_ptr<Variable> variable) | |
|
257 | { | |
|
258 | } | |
|
259 | ||
|
260 | 256 | std::shared_ptr<Variable> |
|
261 | 257 | VariableController::createVariable(const QString &name, const QVariantHash &metadata, |
|
262 | 258 | std::shared_ptr<IDataProvider> provider) noexcept |
@@ -281,7 +277,6 VariableController::createVariable(const QString &name, const QVariantHash &meta | |||
|
281 | 277 | |
|
282 | 278 | |
|
283 | 279 | auto varRequestId = QUuid::createUuid(); |
|
284 | qCInfo(LOG_VariableController()) << "processRequest for" << name << varRequestId; | |
|
285 | 280 | impl->processRequest(newVariable, range, varRequestId); |
|
286 | 281 | impl->updateVariableRequest(varRequestId); |
|
287 | 282 | |
@@ -336,12 +331,25 void VariableController::onVariableRetrieveDataInProgress(QUuid identifier, doub | |||
|
336 | 331 | |
|
337 | 332 | void VariableController::onAbortProgressRequested(std::shared_ptr<Variable> variable) |
|
338 | 333 | { |
|
339 | qCDebug(LOG_VariableController()) << "TORM: VariableController::onAbortProgressRequested" | |
|
340 | << QThread::currentThread()->objectName(); | |
|
341 | ||
|
342 | 334 | auto it = impl->m_VariableToIdentifierMap.find(variable); |
|
343 | 335 | if (it != impl->m_VariableToIdentifierMap.cend()) { |
|
344 | impl->m_VariableToProviderMap.at(variable)->requestDataAborting(it->second); | |
|
336 | impl->m_VariableAcquisitionWorker->abortProgressRequested(it->second); | |
|
337 | ||
|
338 | QUuid varRequestId; | |
|
339 | auto varIdToVarRequestIdQueueMapIt = impl->m_VarIdToVarRequestIdQueueMap.find(it->second); | |
|
340 | if (varIdToVarRequestIdQueueMapIt != impl->m_VarIdToVarRequestIdQueueMap.cend()) { | |
|
341 | auto &varRequestIdQueue = varIdToVarRequestIdQueueMapIt->second; | |
|
342 | varRequestId = varRequestIdQueue.front(); | |
|
343 | impl->cancelVariableRequest(varRequestId); | |
|
344 | ||
|
345 | // Finish the progression for the request | |
|
346 | impl->m_VariableModel->setDataProgress(variable, 0.0); | |
|
347 | } | |
|
348 | else { | |
|
349 | qCWarning(LOG_VariableController()) | |
|
350 | << tr("Aborting progression of inexistant variable request detected !!!") | |
|
351 | << QThread::currentThread()->objectName(); | |
|
352 | } | |
|
345 | 353 | } |
|
346 | 354 | else { |
|
347 | 355 | qCWarning(LOG_VariableController()) |
@@ -434,8 +442,8 void VariableController::onRequestDataLoading(QVector<std::shared_ptr<Variable> | |||
|
434 | 442 | // For the other, we ask the provider to give them. |
|
435 | 443 | |
|
436 | 444 | auto varRequestId = QUuid::createUuid(); |
|
437 |
qC |
|
|
438 | << QThread::currentThread()->objectName() << varRequestId; | |
|
445 | qCDebug(LOG_VariableController()) << "VariableController::onRequestDataLoading" | |
|
446 | << QThread::currentThread()->objectName() << varRequestId; | |
|
439 | 447 | |
|
440 | 448 | for (const auto &var : variables) { |
|
441 | 449 | qCDebug(LOG_VariableController()) << "processRequest for" << var->name() << varRequestId; |
@@ -552,11 +560,7 void VariableController::VariableControllerPrivate::processRequest(std::shared_p | |||
|
552 | 560 | if (!notInCacheRangeList.empty()) { |
|
553 | 561 | varRequest.m_RangeRequested = varStrategyRangesRequested.first; |
|
554 | 562 | varRequest.m_CacheRangeRequested = varStrategyRangesRequested.second; |
|
555 | qCDebug(LOG_VariableAcquisitionWorker()) << tr("TORM processRequest RR ") << rangeRequested; | |
|
556 | qCDebug(LOG_VariableAcquisitionWorker()) << tr("TORM processRequest R ") | |
|
557 | << varStrategyRangesRequested.first; | |
|
558 | qCDebug(LOG_VariableAcquisitionWorker()) << tr("TORM processRequest CR ") | |
|
559 | << varStrategyRangesRequested.second; | |
|
563 | ||
|
560 | 564 | // store VarRequest |
|
561 | 565 | storeVariableRequest(varId, varRequestId, varRequest); |
|
562 | 566 | |
@@ -569,8 +573,8 void VariableController::VariableControllerPrivate::processRequest(std::shared_p | |||
|
569 | 573 | varProvider); |
|
570 | 574 | |
|
571 | 575 | if (!varRequestIdCanceled.isNull()) { |
|
572 |
qC |
|
|
573 | << varRequestIdCanceled; | |
|
576 | qCDebug(LOG_VariableAcquisitionWorker()) << tr("varRequestIdCanceled: ") | |
|
577 | << varRequestIdCanceled; | |
|
574 | 578 | cancelVariableRequest(varRequestIdCanceled); |
|
575 | 579 | } |
|
576 | 580 | } |
@@ -762,9 +766,11 void VariableController::VariableControllerPrivate::updateVariableRequest(QUuid | |||
|
762 | 766 | |
|
763 | 767 | /// @todo MPL: confirm |
|
764 | 768 | // Variable update is notified only if there is no pending request for it |
|
765 | if (m_VarIdToVarRequestIdQueueMap.count(varIdToVarRequestMapIt->first) == 0) { | |
|
766 | emit var->updated(); | |
|
767 | } | |
|
769 | // if | |
|
770 | // (m_VarIdToVarRequestIdQueueMap.count(varIdToVarRequestMapIt->first) | |
|
771 | // == 0) { | |
|
772 | emit var->updated(); | |
|
773 | // } | |
|
768 | 774 | } |
|
769 | 775 | else { |
|
770 | 776 | qCCritical(LOG_VariableController()) |
General Comments 2
Pull request updated. Auto status change to "Under Review"
Changed commits: * 2 added * 0 removed Changed files: * A core/include/Variable/VariableAcquisitionWorker.h * M core/include/Data/IDataProvider.h * M core/include/Variable/VariableController.h * M core/src/Network/NetworkController.cpp * M core/src/Variable/VariableAcquisitionWorker.cpp * M core/src/Variable/VariableController.cpp * M plugins/amda/src/AmdaProvider.cpp
You need to be logged in to leave comments.
Login now