[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [master] Improve reboot modes in init.c and shutdown.c.



+void shutDown(int doKill, reboot_action rebootAction)
+{
+    if (rebootAction != DELAYED_REBOOT) {
+        performUnmounts();
+        performTerminations();
+        performReboot(rebootAction);
+    }
+    performDelayedReboot();

Maybe that is safer?
Plus probably a "return" or "exit(0)" to make the compiler happy.

Pressing CTRL+C or CAD afterwards will again put the user in the
performDelayedReboot by means of init.c:sigintHandler() because of
nokill. I guess that would be intended. After all it is safe. ;)

Or am I completely off track here?

Steffen


Hi,

You are right and I didn't consider the nokill option much. Your patch is completely disregarding doKill, but suppose we used this version instead:
void shutDown(int doKill, reboot_action rebootAction)
{
    if (rebootAction != DELAYED_REBOOT && doKill) {
        performUnmounts();
        performTerminations();
        performReboot(rebootAction);
    }
    performDelayedReboot();
}

Here's what happens with any rebootAction and doKill=0:
:: the program goes into the endless loop in performDelayedReboot()
:: user presses cad, sigint handler is triggered
:: it calls getKillPolicy() that tells it to call shutDown() with doKill=0 again
:: endless loop in performDelayedReboot() again

I agree that with 'nokill' we should always do DELAYED_REBOOT. What we need to make it work correctly though is a mechanism to remember that we called performDelayedReboot() already and are ready to do normal shutdown. There's no nice solution: having the signitHandler() called in the middle we can't pass this information around as a parameter. Maybe we can use a static variable:

void shutDown(int doKill, reboot_action rebootAction)
{
    static int reentered = 0;

    if (reentered) {
        performUnmounts();
        performTerminations();
        performReboot(rebootAction);
    }
    reentered = 1;
    if (rebootAction == DELAYED_REBOOT || !doKill) {
        performDelayedReboot();
    } else {
        performUnmounts();
        performTerminations();
        performReboot(rebootAction);
    }
    exit(0);
}

What do you think?

Ales


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]