/*** Copyright (C) 2021-2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuAsyncFuncRunnable.cpp Date: 2023-12-06 Date: 2021-11-2 Author: Reece ***/ #include #include "IAsyncRunnable.hpp" #include "AuAsyncFuncRunnable.hpp" namespace Aurora::Async { AsyncFuncRunnable::AsyncFuncRunnable(AuFunction &&callback) : callback(AuMove(callback)) { } AsyncFuncRunnable::AsyncFuncRunnable(AuFunction &&callback, AuFunction &&fail) : callback(AuMove(callback)), fail(AuMove(fail)) { } AsyncFuncRunnable::AsyncFuncRunnable(const AuFunction &callback) : callback(callback) { } AsyncFuncRunnable::AsyncFuncRunnable(const AuFunction &callback, const AuFunction &fail) : callback(callback), fail(fail) { } void AsyncFuncRunnable::RunAsync() { AU_LOCK_GUARD(this->lock); try { if (auto callback = AuExchange(this->callback, {})) { callback(); } } catch (...) { SysPushErrorCatch(); this->CancelAsync(); } this->fail = {}; } void AsyncFuncRunnable::CancelAsync() { AU_LOCK_GUARD(this->lock); try { if (auto callback = AuExchange(this->fail, {})) { callback(); } } catch (...) { SysPushErrorCatch(); } this->callback = {}; } }