[PATCH 3/3] Maemo6 MCE: handle race condition at startup

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Since bluetoothd power cycles the adapter at startup, it is possible
that the plugin gets a reply from reading the state of the MCE and
tries to power the adapter before it is down. The patch checks for
that situation and if it occurs postpones powering the adapter to
the mode change callback. The off_requested member of btd_adapter
is used for the check, so it is set to FALSE when the adapter is
down.

/Daniel
From 16455aa43369853f2724d16751a41724df9a4fd5 Mon Sep 17 00:00:00 2001
From: Daniel Orstadius <daniel.orstadius@xxxxxxxxx>
Date: Fri, 13 Aug 2010 11:41:37 +0300
Subject: [PATCH] Maemo6 MCE: handle race condition at startup

Since bluetoothd power cycles the adapter at startup, it is possible
that the plugin gets a reply from reading the state of the MCE and
tries to power the adapter before it is down. The patch checks for
that situation and if it occurs postpones powering the adapter to
the mode change callback. The off_requested member of btd_adapter
is used for the check, so it is set to FALSE when the adapter is
down.
---
 plugins/maemo6.c |   24 ++++++++++++++++++++++++
 src/adapter.c    |    1 +
 2 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/plugins/maemo6.c b/plugins/maemo6.c
index 20e5c00..4a04fa9 100644
--- a/plugins/maemo6.c
+++ b/plugins/maemo6.c
@@ -50,6 +50,7 @@
 static guint watch_id;
 static DBusConnection *conn = NULL;
 static gboolean mce_bt_set = FALSE;
+static gboolean collision = FALSE;
 
 static gboolean mce_signal_callback(DBusConnection *connection,
 					DBusMessage *message, void *user_data)
@@ -112,6 +113,14 @@ static void read_radio_states_cb(DBusPendingCall *call, void *user_data)
 
 	mce_bt_set = radio_states & MCE_RADIO_STATE_BLUETOOTH;
 
+	/* check if the adapter has not completed the initial power
+	   cycle, if so delay action to mce_notify_powered */
+
+	collision = adapter_powering_down(adapter);
+
+	if (collision)
+		goto done;
+
 	if (mce_bt_set)
 		btd_adapter_switch_online(adapter);
 	else
@@ -133,6 +142,21 @@ static void adapter_mode_change(struct btd_adapter *adapter, gboolean powered)
 	if (mce_bt_set == powered)
 		return;
 
+	/* check if the plugin got the reply from the mce when the
+	   adapter was not yet down during the power cycling when
+	   bluetoothd is started */
+	if (collision) {
+		error("maemo6: collision");
+		collision = FALSE;
+
+		if (mce_bt_set)
+			btd_adapter_switch_online(adapter);
+		else
+			btd_adapter_switch_offline(adapter);
+
+		return;
+	}
+
 	/* set the mce value according to the state of the adapter */
 	msg = dbus_message_new_method_call(MCE_SERVICE, MCE_REQUEST_PATH,
 				MCE_REQUEST_IF, MCE_RADIO_STATES_CHANGE_REQ);
diff --git a/src/adapter.c b/src/adapter.c
index ff78539..712ca08 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2502,6 +2502,7 @@ int adapter_stop(struct btd_adapter *adapter)
 	adapter->state = DISCOVER_TYPE_NONE;
 	adapter->cache_enable = TRUE;
 	adapter->pending_cod = 0;
+	adapter->off_requested = FALSE;
 
 	adapter_mode_callbacks(adapter, FALSE);
 
-- 
1.6.0.4


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux