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)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/message_loop/message_loop_proxy_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/logging.h"
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/incoming_task_queue.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace internal {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochMessageLoopProxyImpl::MessageLoopProxyImpl(
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    scoped_refptr<IncomingTaskQueue> incoming_queue)
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : incoming_queue_(incoming_queue),
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      valid_thread_id_(PlatformThread::CurrentId()) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MessageLoopProxyImpl::PostDelayedTask(
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const tracked_objects::Location& from_here,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Closure& task,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta delay) {
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DCHECK(!task.is_null()) << from_here.ToString();
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return incoming_queue_->AddToIncomingQueue(from_here, task, delay, true);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MessageLoopProxyImpl::PostNonNestableDelayedTask(
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const tracked_objects::Location& from_here,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Closure& task,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta delay) {
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DCHECK(!task.is_null()) << from_here.ToString();
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return incoming_queue_->AddToIncomingQueue(from_here, task, delay, false);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MessageLoopProxyImpl::RunsTasksOnCurrentThread() const {
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return valid_thread_id_ == PlatformThread::CurrentId();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochMessageLoopProxyImpl::~MessageLoopProxyImpl() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace internal
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<MessageLoopProxy>
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageLoopProxy::current() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop* cur_loop = MessageLoop::current();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cur_loop)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cur_loop->message_loop_proxy();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
55