| 1748 | continue; |
| 1749 | } |
| 1750 | completeCancellation(eventLoop, *async); |
| 1751 | async = next; |
| 1752 | } |
| 1753 | } |
| 1754 | |
| 1755 | void SC::AsyncEventLoop::Internal::completeCancellation(AsyncEventLoop& eventLoop, AsyncRequest& async) |
| 1756 | { |
| 1757 | AsyncSequence* sequenceToResume = nullptr; |
| 1758 | if (async.sequence and not async.sequence->clearSequenceOnCancel) |
| 1759 | { |
| 1760 | sequenceToResume = async.sequence; |
| 1761 | } |
| 1762 | if (async.type == AsyncRequest::Type::ExternalCompletion) |
| 1763 | { |
| 1764 | AsyncExternalCompletion& externalCompletion = static_cast<AsyncExternalCompletion&>(async); |
| 1765 | if (externalCompletion.hasSubmissionPending()) |
| 1766 | { |
| 1767 | SC_ASYNC_TRUST_RESULT(externalCompletion.clearSubmissionPending()); |
| 1768 | } |
| 1769 | #if SC_PLATFORM_WINDOWS |
| 1770 | externalCompletion.overlapped.get().userData = nullptr; |
| 1771 | #endif |
| 1772 | } |
| 1773 | if (async.sequence and async.sequence->runningRequest == &async) |
| 1774 | { |
| 1775 | async.sequence->runningAsync = false; |
| 1776 | async.sequence->runningRequest = nullptr; |
| 1777 | } |
| 1778 | async.markAsFree(); |
| 1779 | cancellations.remove(async); |
| 1780 | if (sequenceToResume) |
| 1781 | { |
| 1782 | resumeSequence(*sequenceToResume); |
| 1783 | } |
| 1784 | else if (async.sequence) |
| 1785 | { |
| 1786 | untrackSequenceIfIdle(*async.sequence); |
| 1787 | } |
| 1788 | if (async.closeCallback) |
| 1789 | { |
| 1790 | Function<void(AsyncResult&)> closeCallback = *async.closeCallback; |
| 1791 | async.closeCallback = nullptr; |
| 1792 | |
| 1793 | Result result(true); |
| 1794 | AsyncResult res(eventLoop, async, result); |
| 1795 | closeCallback(res); |
nothing calls this directly
no test coverage detected