blob: f2ca4b65f54cc38d151c57a6f5588c105033efa0 [file] [log] [blame]
Paul Stewart5f06a0e2012-12-20 11:11:33 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Paul Stewart75897df2011-04-27 09:05:53 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Paul Stewart26b327e2011-10-19 11:38:09 -07005#include "shill/event_dispatcher.h"
Darin Petkov67d8ecf2011-07-26 16:03:30 -07006
Paul Stewart75897df2011-04-27 09:05:53 -07007#include <stdio.h>
8#include <glib.h>
9
Eric Shienbrood3e20a232012-02-16 11:35:56 -050010#include <base/callback.h>
11#include <base/location.h>
Chris Masone0e1d1042011-05-09 18:07:03 -070012#include <base/message_loop_proxy.h>
Paul Stewart5ad16062013-02-21 18:10:48 -080013#include <base/run_loop.h>
14#include <base/time.h>
Chris Masone0e1d1042011-05-09 18:07:03 -070015
Paul Stewartf0aae102011-10-19 12:11:44 -070016#include "shill/glib_io_input_handler.h"
17#include "shill/glib_io_ready_handler.h"
Paul Stewart75897df2011-04-27 09:05:53 -070018
Eric Shienbrood3e20a232012-02-16 11:35:56 -050019using base::Callback;
20using base::Closure;
21
Paul Stewart75897df2011-04-27 09:05:53 -070022namespace shill {
23
Chris Masone0e1d1042011-05-09 18:07:03 -070024EventDispatcher::EventDispatcher()
25 : dont_use_directly_(new MessageLoopForUI),
Eric Shienbrood3e20a232012-02-16 11:35:56 -050026 message_loop_proxy_(base::MessageLoopProxy::current()) {
Chris Masone0e1d1042011-05-09 18:07:03 -070027}
Paul Stewarta43d9232011-05-10 11:40:22 -070028
Chris Masone0e1d1042011-05-09 18:07:03 -070029EventDispatcher::~EventDispatcher() {}
30
31void EventDispatcher::DispatchForever() {
32 MessageLoop::current()->Run();
33}
34
Darin Petkov67d8ecf2011-07-26 16:03:30 -070035void EventDispatcher::DispatchPendingEvents() {
Paul Stewart5ad16062013-02-21 18:10:48 -080036 base::RunLoop().RunUntilIdle();
Darin Petkov67d8ecf2011-07-26 16:03:30 -070037}
38
Eric Shienbrood3e20a232012-02-16 11:35:56 -050039bool EventDispatcher::PostTask(const Closure &task) {
mukesh agrawalf60e4062011-05-27 13:13:41 -070040 return message_loop_proxy_->PostTask(FROM_HERE, task);
Chris Masone0e1d1042011-05-09 18:07:03 -070041}
42
Eric Shienbrood3e20a232012-02-16 11:35:56 -050043bool EventDispatcher::PostDelayedTask(const Closure &task, int64 delay_ms) {
Paul Stewart5ad16062013-02-21 18:10:48 -080044 return message_loop_proxy_->PostDelayedTask(
45 FROM_HERE, task, base::TimeDelta::FromMilliseconds(delay_ms));
Chris Masone0e1d1042011-05-09 18:07:03 -070046}
47
Paul Stewart26b327e2011-10-19 11:38:09 -070048IOHandler *EventDispatcher::CreateInputHandler(
Chris Masone0e1d1042011-05-09 18:07:03 -070049 int fd,
Paul Stewart5f06a0e2012-12-20 11:11:33 -080050 const IOHandler::InputCallback &input_callback,
51 const IOHandler::ErrorCallback &error_callback) {
52 IOHandler *handler = new GlibIOInputHandler(
53 fd, input_callback, error_callback);
Paul Stewartf0aae102011-10-19 12:11:44 -070054 handler->Start();
55 return handler;
56}
57
58IOHandler *EventDispatcher::CreateReadyHandler(
59 int fd,
60 IOHandler::ReadyMode mode,
Paul Stewart5f06a0e2012-12-20 11:11:33 -080061 const Callback<void(int)> &ready_callback) {
62 IOHandler *handler = new GlibIOReadyHandler(fd, mode, ready_callback);
Paul Stewartf0aae102011-10-19 12:11:44 -070063 handler->Start();
64 return handler;
Paul Stewarta43d9232011-05-10 11:40:22 -070065}
66
Paul Stewart75897df2011-04-27 09:05:53 -070067} // namespace shill