void XCSoarInterface::Shutdown() { VerboseOperationEnvironment operation; gcc_unused ScopeBusyIndicator busy; // Show progress dialog operation.SetText(_("Shutdown, please wait...")); // Log shutdown information LogStartUp(_T("Entering shutdown...")); StartupLogFreeRamAndStorage(); // Turn off all displays globalRunningEvent.Reset(); #ifdef HAVE_TRACKING if (tracking != NULL) tracking->StopAsync(); #endif // Stop logger and save igc file operation.SetText(_("Shutdown, saving logs...")); logger.GUIStopLogger(Basic(), true); delete flight_logger; flight_logger = NULL; GetLiveBlackboard().RemoveListener(glide_computer_events); FlarmFriends::Save(); // Save settings to profile operation.SetText(_("Shutdown, saving profile...")); Profile::Save(); // Stop sound AudioVarioGlue::Deinitialise(); operation.SetText(_("Shutdown, please wait...")); // Stop threads LogStartUp(_T("Stop threads")); #ifndef ENABLE_OPENGL draw_thread->BeginStop(); #endif calculation_thread->BeginStop(); merge_thread->BeginStop(); // Wait for the calculations thread to finish LogStartUp(_T("Waiting for calculation thread")); merge_thread->Join(); delete merge_thread; merge_thread = NULL; calculation_thread->Join(); delete calculation_thread; calculation_thread = NULL; // Wait for the drawing thread to finish #ifndef ENABLE_OPENGL LogStartUp(_T("Waiting for draw thread")); draw_thread->Join(); delete draw_thread; #endif LogStartUp(_T("delete MapWindow")); main_window.Deinitialise(); // Save the task for the next time operation.SetText(_("Shutdown, saving task...")); LogStartUp(_T("Save default task")); protected_task_manager->TaskSaveDefault(); // Clear waypoint database LogStartUp(_T("Close waypoints")); way_points.Clear(); operation.SetText(_("Shutdown, please wait...")); // Clear weather database LogStartUp(_T("CloseRASP")); RASP.Close(); // Clear terrain database LogStartUp(_T("CloseTerrain")); delete terrain; LogStartUp(_T("CloseTopography")); delete topography; delete protected_marks; delete marks; // Close any device connections devShutdown(); NMEALogger::Shutdown(); delete replay; DeviceListDeinitialise(); delete device_blackboard; device_blackboard = NULL; protected_task_manager->SetRoutePlanner(NULL); delete protected_task_manager; delete task_manager; #ifdef HAVE_NET delete noaa_store; #endif #ifdef HAVE_TRACKING if (tracking != NULL) { tracking->WaitStopped(); delete tracking; } #endif // Close the progress dialog LogStartUp(_T("Close Progress Dialog")); operation.Hide(); // Clear the EGM96 database EGM96::Close(); delete glide_computer; // Clear airspace database LogStartUp(_T("Close airspace")); airspace_database.clear(); // Destroy FlarmNet records FlarmNet::Destroy(); delete file_cache; LogStartUp(_T("Close Windows - main")); main_window.reset(); CloseLanguageFile(); Display::RestoreOrientation(); StartupLogFreeRamAndStorage(); LogStartUp(_T("Finished shutdown")); }