| 219 | }; |
| 220 | |
| 221 | class FailCancelWorker : public AsyncWorker { |
| 222 | private: |
| 223 | bool taskIsRunning = false; |
| 224 | std::mutex mu; |
| 225 | std::condition_variable taskStartingCv; |
| 226 | void NotifyJSThreadTaskHasStarted() { |
| 227 | { |
| 228 | std::lock_guard<std::mutex> lk(mu); |
| 229 | taskIsRunning = true; |
| 230 | taskStartingCv.notify_one(); |
| 231 | } |
| 232 | } |
| 233 | |
| 234 | public: |
| 235 | FailCancelWorker(Function& cb) : AsyncWorker(cb) {} |
| 236 | ~FailCancelWorker() {} |
| 237 | |
| 238 | void WaitForWorkerTaskToStart() { |
| 239 | std::unique_lock<std::mutex> lk(mu); |
| 240 | taskStartingCv.wait(lk, [this] { return taskIsRunning; }); |
| 241 | taskIsRunning = false; |
| 242 | } |
| 243 | |
| 244 | static void DoCancel(const CallbackInfo& info) { |
| 245 | Function cb = info[0].As<Function>(); |
| 246 | |
| 247 | FailCancelWorker* cancelWorker = new FailCancelWorker(cb); |
| 248 | cancelWorker->Queue(); |
| 249 | cancelWorker->WaitForWorkerTaskToStart(); |
| 250 | |
| 251 | #ifdef NAPI_CPP_EXCEPTIONS |
| 252 | try { |
| 253 | cancelWorker->Cancel(); |
| 254 | } catch (Napi::Error&) { |
| 255 | Napi::Error::New(info.Env(), "Unable to cancel async worker tasks") |
| 256 | .ThrowAsJavaScriptException(); |
| 257 | } |
| 258 | #else |
| 259 | cancelWorker->Cancel(); |
| 260 | #endif |
| 261 | } |
| 262 | |
| 263 | void Execute() override { |
| 264 | NotifyJSThreadTaskHasStarted(); |
| 265 | std::this_thread::sleep_for(std::chrono::seconds(1)); |
| 266 | } |
| 267 | |
| 268 | void OnOK() override {} |
| 269 | |
| 270 | void OnError(const Error&) override {} |
| 271 | }; |
| 272 | |
| 273 | class CancelWorker : public AsyncWorker { |
| 274 | public: |
nothing calls this directly
no outgoing calls
no test coverage detected