| 691 | } |
| 692 | |
| 693 | void ThreadSafeApi::runNetwork() { |
| 694 | Optional<Error> runErr; |
| 695 | try { |
| 696 | ::runNetwork(); |
| 697 | } catch (Error& e) { |
| 698 | TraceEvent(SevError, "RunNetworkError").error(e); |
| 699 | runErr = e; |
| 700 | } catch (std::exception& e) { |
| 701 | runErr = unknown_error(); |
| 702 | TraceEvent(SevError, "RunNetworkError").error(unknown_error()).detail("RootException", e.what()); |
| 703 | } catch (...) { |
| 704 | runErr = unknown_error(); |
| 705 | TraceEvent(SevError, "RunNetworkError").error(unknown_error()); |
| 706 | } |
| 707 | |
| 708 | for (auto& hook : threadCompletionHooks) { |
| 709 | try { |
| 710 | hook.first(hook.second); |
| 711 | } catch (Error& e) { |
| 712 | TraceEvent(SevError, "NetworkShutdownHookError").error(e); |
| 713 | } catch (std::exception& e) { |
| 714 | TraceEvent(SevError, "NetworkShutdownHookError").error(unknown_error()).detail("RootException", e.what()); |
| 715 | } catch (...) { |
| 716 | TraceEvent(SevError, "NetworkShutdownHookError").error(unknown_error()); |
| 717 | } |
| 718 | } |
| 719 | |
| 720 | if (runErr.present()) { |
| 721 | closeTraceFile(); |
| 722 | throw runErr.get(); |
| 723 | } |
| 724 | |
| 725 | TraceEvent("RunNetworkTerminating"); |
| 726 | closeTraceFile(); |
| 727 | } |
| 728 | |
| 729 | void ThreadSafeApi::stopNetwork() { |
| 730 | ::stopNetwork(); |
no test coverage detected