Remove indirection task for creating a modem object.
Creating a modem object causes a DBus call (to register the object on
the bus). This used to cause a deadlock, but ers fixed the deadlock,
so now we don't need the indirection.
BUG=chromium-os:27936
TEST=creates a cromo modem
Change-Id: I226248001989781c6098cc620b30584aabb59e4c
Reviewed-on: https://gerrit.chromium.org/gerrit/18399
Reviewed-by: Eric Shienbrood <ers@chromium.org>
Tested-by: David Rochberg <rochberg@chromium.org>
Commit-Ready: David Rochberg <rochberg@chromium.org>
diff --git a/modem.cc b/modem.cc
index b36b5c6..7b938ed 100644
--- a/modem.cc
+++ b/modem.cc
@@ -53,16 +53,6 @@
void Modem::Init() {
VLOG(2) << __func__;
CHECK(!device_.get());
-
- // Defer device creation because dbus-c++ doesn't allow registration of new
- // D-Bus objects in the context of a D-Bus signal handler.
- dispatcher_->PostTask(Bind(&Modem::InitTask, AsWeakPtr()));
-}
-
-void Modem::InitTask() {
- VLOG(2) << __func__;
- CHECK(!device_.get());
-
dbus_properties_proxy_.reset(
proxy_factory_->CreateDBusPropertiesProxy(this, path_, owner_));
CreateDevice();
diff --git a/modem.h b/modem.h
index df031d6..e92ba88 100644
--- a/modem.h
+++ b/modem.h
@@ -28,8 +28,7 @@
// Handles an instance of ModemManager.Modem and an instance of a Cellular
// device.
-class Modem : public DBusPropertiesProxyDelegate,
- public base::SupportsWeakPtr<Modem> {
+class Modem : public DBusPropertiesProxyDelegate {
public:
// |owner| is the ModemManager DBus service owner (e.g., ":1.17"). |path| is
// the ModemManager.Modem DBus object path (e.g.,
@@ -61,8 +60,6 @@
static const char kPropertyState[];
static const char kPropertyType[];
- void InitTask();
-
// Creates and registers a Cellular device in |device_| based on
// ModemManager.Modem's |properties|. The device may not be created if the
// properties are invalid.
diff --git a/modem_manager_unittest.cc b/modem_manager_unittest.cc
index d48f4f3..22ba368 100644
--- a/modem_manager_unittest.cc
+++ b/modem_manager_unittest.cc
@@ -22,6 +22,7 @@
using std::vector;
using testing::_;
using testing::Invoke;
+using testing::Pointee;
using testing::Return;
using testing::StrEq;
using testing::Test;
@@ -164,6 +165,26 @@
EXPECT_EQ(0, modem_manager_.modems_.size());
}
+class ModemManagerClassicMockInit : public ModemManagerClassic {
+ public:
+ ModemManagerClassicMockInit(const string &service,
+ const string &path,
+ ControlInterface *control_interface,
+ EventDispatcher *dispatcher,
+ Metrics *metrics,
+ Manager *manager,
+ GLib *glib,
+ mobile_provider_db *provider_db) :
+ ModemManagerClassic(service,
+ path,
+ control_interface,
+ dispatcher,
+ metrics,
+ manager,
+ glib,
+ provider_db) {}
+ MOCK_METHOD1(InitModem, void(shared_ptr<Modem> modem));
+};
class ModemManagerClassicTest : public ModemManagerTest {
public:
@@ -205,7 +226,7 @@
modem_manager_.proxy_factory_ = NULL;
}
- ModemManagerClassic modem_manager_;
+ ModemManagerClassicMockInit modem_manager_;
scoped_ptr<MockModemManagerProxy> proxy_;
TestProxyFactory proxy_factory_;
};
@@ -216,6 +237,9 @@
EXPECT_CALL(*proxy_, EnumerateDevices())
.WillOnce(Return(vector<DBus::Path>(1, kModemPath)));
+ EXPECT_CALL(modem_manager_,
+ InitModem(Pointee(Field(&Modem::path_, StrEq(kModemPath)))));
+
modem_manager_.Connect(kOwner);
EXPECT_EQ(kOwner, modem_manager_.owner_);
EXPECT_EQ(1, modem_manager_.modems_.size());
diff --git a/modem_unittest.cc b/modem_unittest.cc
index d3a6c98..a716e74 100644
--- a/modem_unittest.cc
+++ b/modem_unittest.cc
@@ -120,20 +120,6 @@
SetSockets(NULL);
}
-TEST_F(ModemTest, Init) {
- DBusPropertiesMap props;
-
- SetSockets(&sockets_);
- props[Modem::kPropertyIPMethod].writer().append_uint32(
- MM_MODEM_IP_METHOD_DHCP);
- props[Modem::kPropertyLinkName].writer().append_string("usb1");
- EXPECT_CALL(*proxy_, GetAll(MM_MODEM_INTERFACE)).WillOnce(Return(props));
- modem_->Init();
-
- EXPECT_CALL(sockets_, Socket(PF_INET, SOCK_DGRAM, 0)).WillOnce(Return(-1));
- dispatcher_.DispatchPendingEvents();
-}
-
TEST_F(ModemTest, CreateDeviceFromProperties) {
DBusPropertiesMap props;