15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/glue/task_pump.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace jingle_glue { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TaskPump::TaskPump() 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : posted_wake_(false), 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) stopped_(false), 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_(this) { 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TaskPump::~TaskPump() { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TaskPump::WakeTasks() { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!stopped_ && !posted_wake_) { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop* current_message_loop = base::MessageLoop::current(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(current_message_loop); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do the requested wake up. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_message_loop->PostTask( 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TaskPump::CheckAndRunTasks, weak_factory_.GetWeakPtr())); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) posted_wake_ = true; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 TaskPump::CurrentTime() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only timeout tasks rely on this function. Since we're not using 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // libjingle tasks for timeout, it's safe to return 0 here. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TaskPump::Stop() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stopped_ = true; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TaskPump::CheckAndRunTasks() { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (stopped_) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) posted_wake_ = false; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We shouldn't be using libjingle for timeout tasks, so we should 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have no timeout tasks at all. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Add HasTimeoutTask() back in TaskRunner class and 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uncomment this check. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DCHECK(!HasTimeoutTask()) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTasks(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace jingle_glue 61