| Index: main.cc | 
| diff --git a/main.cc b/main.cc | 
| index f449fa401ece16536a0f9377eae0fe6ace3daa5a..251b10a7b72f38517b079be6d06984f55d0ad149 100644 | 
| --- a/main.cc | 
| +++ b/main.cc | 
| @@ -9,6 +9,7 @@ | 
| #include <gflags/gflags.h> | 
| #include <glib.h> | 
|  | 
| +#include "base/at_exit.h" | 
| #include "base/command_line.h" | 
| #include "base/logging.h" | 
| #include "base/string_util.h" | 
| @@ -45,16 +46,29 @@ gboolean UpdateBootFlags(void* arg) { | 
|  | 
| namespace { | 
|  | 
| +const int kTimeoutOnce = 7 * 60;  // at 7 minutes | 
| +const int kTimeoutPeriodic = 45 * 60;  // every 45 minutes | 
| +const int kTimeoutFuzz = 10 * 60;  // +/- 5 minutes | 
| + | 
| +// Schedules an update check |seconds| from now, while adding some fuzz. | 
| +void ScheduleUpdateCheck(int seconds, | 
| +                         GSourceFunc update_function, | 
| +                         UpdateAttempter* update_attempter) { | 
| +  seconds = utils::FuzzInt(seconds, kTimeoutFuzz); | 
| +  g_timeout_add_seconds(seconds, update_function, update_attempter); | 
| +} | 
| + | 
| gboolean UpdateOnce(void* arg) { | 
| UpdateAttempter* update_attempter = reinterpret_cast<UpdateAttempter*>(arg); | 
| update_attempter->Update("", ""); | 
| -  return FALSE; | 
| +  return FALSE;  // Don't run again. | 
| } | 
|  | 
| gboolean UpdatePeriodically(void* arg) { | 
| UpdateAttempter* update_attempter = reinterpret_cast<UpdateAttempter*>(arg); | 
| update_attempter->Update("", ""); | 
| -  return TRUE; | 
| +  ScheduleUpdateCheck(kTimeoutPeriodic, &UpdatePeriodically, update_attempter); | 
| +  return FALSE;  // Don't run again. | 
| } | 
|  | 
| void SchedulePeriodicUpdateChecks(UpdateAttempter* update_attempter) { | 
| @@ -62,16 +76,13 @@ void SchedulePeriodicUpdateChecks(UpdateAttempter* update_attempter) { | 
| LOG(WARNING) << "Non-official build: periodic update checks disabled."; | 
| return; | 
| } | 
| - | 
| if (utils::IsRemovableDevice(utils::RootDevice(utils::BootDevice()))) { | 
| LOG(WARNING) << "Removable device boot: periodic update checks disabled."; | 
| return; | 
| } | 
| - | 
| -  // Kick off periodic updating. First, update after 2 minutes. Also, update | 
| -  // every 30 minutes. | 
| -  g_timeout_add_seconds(2 * 60, &UpdateOnce, update_attempter); | 
| -  g_timeout_add_seconds(30 * 60, &UpdatePeriodically, update_attempter); | 
| +  // Kick off periodic updating. | 
| +  ScheduleUpdateCheck(kTimeoutOnce, &UpdateOnce, update_attempter); | 
| +  ScheduleUpdateCheck(kTimeoutPeriodic, &UpdatePeriodically, update_attempter); | 
| } | 
|  | 
| void SetupDbusService(UpdateEngineService* service) { | 
| @@ -118,6 +129,7 @@ int main(int argc, char** argv) { | 
| ::g_type_init(); | 
| g_thread_init(NULL); | 
| dbus_g_thread_init(); | 
| +  base::AtExitManager exit_manager;  // Required for base/rand_util.h. | 
| chromeos_update_engine::Subprocess::Init(); | 
| google::ParseCommandLineFlags(&argc, &argv, true); | 
| CommandLine::Init(argc, argv); | 
|  |