| 3193 | } |
| 3194 | |
| 3195 | void Application::recomputeWorker() |
| 3196 | { |
| 3197 | while (!_stopRecomputeThread) { |
| 3198 | std::unique_lock<std::mutex> lock(_recomputeMutex); |
| 3199 | // Wait until either stop is signaled or there is at least one pending request. |
| 3200 | _recomputeRequestAvailable.wait(lock, [this] { |
| 3201 | return _stopRecomputeThread || !_recomputeRequests.empty(); |
| 3202 | }); |
| 3203 | if (_stopRecomputeThread) { |
| 3204 | break; |
| 3205 | } |
| 3206 | |
| 3207 | // Process all pending recompute requests. |
| 3208 | while (!_recomputeRequests.empty()) { |
| 3209 | RecomputeRequest request = takeNextRecomputeRequest(_recomputeRequests); |
| 3210 | if (!request.documentName.empty()) { |
| 3211 | _recomputeDocumentsInProgress.insert(request.documentName); |
| 3212 | } |
| 3213 | |
| 3214 | // Unlock while processing to allow other threads to add new requests. |
| 3215 | lock.unlock(); |
| 3216 | |
| 3217 | RecomputeResult result = processRecomputeRequest(request); |
| 3218 | |
| 3219 | if (request.callback) { |
| 3220 | request.callback(request, result); |
| 3221 | } |
| 3222 | |
| 3223 | lock.lock(); |
| 3224 | if (!request.documentName.empty()) { |
| 3225 | _recomputeDocumentsInProgress.erase(request.documentName); |
| 3226 | _recomputeStateChanged.notify_all(); |
| 3227 | } |
| 3228 | } |
| 3229 | } |
| 3230 | } |
| 3231 | |
| 3232 | void Application::logStatus() |
| 3233 | { |
nothing calls this directly
no test coverage detected