/*- * Copyright (c) 2017-2021 Carsten Sonne Larsen * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "config.h" #include "shutdown.h" #include "message.h" #include "sync.h" #include "win.h" #include "logmod.h" #define MODULENAME "Shutdown" static volatile bool ShutdownInProgress = false; static void ShutdownSettingsWindow(void) { int count = 0; LogTrace("Requesting settings window to close"); SendMessageWait(MSGPORT_WINDOW, ATK_SHUTDOWN); LogTrace("Waiting for settings window to close ..."); while (WindowProcRunning) { count++; if (count % 10 == 0) { LogTrace("Waiting for settings window to close ..."); } Delay(50); } LogTrace("Settings window closed"); } static void ShutdownSynchronizerProcess(void) { int count = 0; LogTrace("Requesting synchronizer process to stop"); SendMessageWait(MSGPORT_SYNCER, ATK_SHUTDOWN); LogTrace("Waiting for synchronizer process to exit ..."); while (SynchronizerRunning) { count++; if (count % 10 == 0) { LogTrace("Waiting for synchronizer process to exit ..."); } Delay(50); } LogTrace("Synchronizer process exited"); } static void ShutdownProc(void) { ShutdownSettingsWindow(); ShutdownSynchronizerProcess(); LogTrace("Complete"); SendMessageWait(MSGPORT_BROKER, ATK_SHUTDOWN); } void StartShutdown(void) { struct Task *task; if (ShutdownInProgress) { LogWarn("Shutdown already in progress"); return; } ShutdownInProgress = true; LogNotice("Initiating shutdown"); task = (struct Task *)CreateNewProcTags( NP_Entry, (IPTR)ShutdownProc, NP_StackSize, 32 * 1024, NP_Name, 0, NP_Input, 0, NP_Output, 0, NP_Error, 0, NP_CloseInput, FALSE, NP_CloseOutput, FALSE, NP_CloseError, FALSE, NP_WindowPtr, 0, NP_ConsoleTask, 0, NP_Cli, FALSE, TAG_DONE); if (task == NULL) { LogError("Could not start shutdown procedure"); } }