1 // Copyright 2016 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/task_scheduler/task.h" 6 7 #include <utility> 8 9 #include "base/critical_closure.h" 10 11 namespace base { 12 namespace internal { 13 14 Task::Task(const tracked_objects::Location& posted_from, 15 OnceClosure task, 16 const TaskTraits& traits, 17 TimeDelta delay) 18 : PendingTask( 19 posted_from, 20 traits.shutdown_behavior() == TaskShutdownBehavior::BLOCK_SHUTDOWN 21 ? MakeCriticalClosure(std::move(task)) 22 : std::move(task), 23 delay.is_zero() ? TimeTicks() : TimeTicks::Now() + delay, 24 false), // Not nestable. 25 // Prevent a delayed BLOCK_SHUTDOWN task from blocking shutdown before 26 // being scheduled by changing its shutdown behavior to SKIP_ON_SHUTDOWN. 27 traits(!delay.is_zero() && traits.shutdown_behavior() == 28 TaskShutdownBehavior::BLOCK_SHUTDOWN 29 ? TaskTraits(traits).WithShutdownBehavior( 30 TaskShutdownBehavior::SKIP_ON_SHUTDOWN) 31 : traits), 32 delay(delay) {} 33 34 Task::~Task() = default; 35 36 } // namespace internal 37 } // namespace base 38