void StartForceQuitWatchdog(hal::ShutdownMode aMode, int32_t aTimeoutSecs) { // Force-quits are intepreted a little more ferociously on Gonk, // because while Gecko is in the process of shutting down, the user // can't call 911, for example. And if we hang on shutdown, bad // things happen. So, make sure that doesn't happen. if (aTimeoutSecs <= 0) { return; } // Use a raw pthread here to insulate ourselves from bugs in other // Gecko code that we're trying to protect! // // Note that we let the watchdog in charge of releasing |paramPtr| // if the pthread is successfully created. watchdogParam_t* paramPtr = new watchdogParam_t(aMode, aTimeoutSecs); pthread_t watchdog; if (pthread_create(&watchdog, nullptr, ForceQuitWatchdog, reinterpret_cast<void*>(paramPtr))) { // Better safe than sorry. delete paramPtr; QuitHard(aMode); } // The watchdog thread is off and running now. }
// Function to complusively shut down the system with a given mode when timeout. static void* ForceQuitWatchdog(void* aParamPtr) { watchdogParam_t* paramPtr = reinterpret_cast<watchdogParam_t*>(aParamPtr); if (paramPtr->timeoutSecs > 0 && paramPtr->timeoutSecs <= 30) { // If we shut down normally before the timeout, this thread will // be harmlessly reaped by the OS. sleep(paramPtr->timeoutSecs); } hal::ShutdownMode mode = paramPtr->mode; delete paramPtr; QuitHard(mode); return nullptr; }
// Function to complusively shut down the system with a given mode when timeout. static void* ForceQuitWatchdog(void* aParamPtr) { watchdogParam_t* paramPtr = reinterpret_cast<watchdogParam_t*>(aParamPtr); if (paramPtr->timeoutSecs > 0 && paramPtr->timeoutSecs <= 30) { // If we shut down normally before the timeout, this thread will // be harmlessly reaped by the OS. TimeStamp deadline = (TimeStamp::Now() + TimeDuration::FromSeconds(paramPtr->timeoutSecs)); while (true) { TimeDuration remaining = (deadline - TimeStamp::Now()); int sleepSeconds = int(remaining.ToSeconds()); if (sleepSeconds <= 0) { break; } sleep(sleepSeconds); } } hal::ShutdownMode mode = paramPtr->mode; delete paramPtr; QuitHard(mode); return nullptr; }