Bug 978809: Remove sToggleBtMonitor from Bluedroid backend, r=echou

When enabling or disabling Bluetooth, the Bluedroid backend waits
on sToggleBtMonitor until a BT adapter has been activated. Once
the monitor gets notified, the backend sends a ToggleBtAck runnable
to the main thread.

This patch removes sToggleBtMonitor from the Bluetooth Bluedroid
backend. Instead of signalling the monitor's notification, the
Bluedroid handler function sends the ToggleBtAck directly.
This commit is contained in:
Thomas Zimmermann 2014-03-06 12:43:35 +01:00
parent e7759d8ae3
commit 59813d6a1f

View File

@ -55,7 +55,6 @@ static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sGetDeviceRunnableArray;
static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sSetPropertyRunnableArray; static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sSetPropertyRunnableArray;
static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sUnbondingRunnableArray; static nsTArray<nsRefPtr<BluetoothReplyRunnable> > sUnbondingRunnableArray;
static nsTArray<int> sRequestedDeviceCountArray; static nsTArray<int> sRequestedDeviceCountArray;
static StaticAutoPtr<Monitor> sToggleBtMonitor;
/** /**
* Classes only used in this file * Classes only used in this file
@ -246,9 +245,11 @@ AdapterStateChangeCallback(bt_state_t aStatus)
sIsBtEnabled = (aStatus == BT_STATE_ON); sIsBtEnabled = (aStatus == BT_STATE_ON);
{ nsRefPtr<nsRunnable> runnable =
MonitorAutoLock lock(*sToggleBtMonitor); new BluetoothService::ToggleBtAck(sIsBtEnabled);
lock.Notify(); if (NS_FAILED(NS_DispatchToMainThread(runnable))) {
BT_WARNING("Failed to dispatch to main thread!");
return;
} }
if (sIsBtEnabled && if (sIsBtEnabled &&
@ -670,15 +671,17 @@ StartStopGonkBluetooth(bool aShouldEnable)
if (sIsBtEnabled == aShouldEnable) { if (sIsBtEnabled == aShouldEnable) {
// Keep current enable status // Keep current enable status
nsRefPtr<nsRunnable> runnable =
new BluetoothService::ToggleBtAck(sIsBtEnabled);
if (NS_FAILED(NS_DispatchToMainThread(runnable))) {
BT_WARNING("Failed to dispatch to main thread!");
}
return NS_OK; return NS_OK;
} }
int ret = aShouldEnable ? sBtInterface->enable() : sBtInterface->disable(); int ret = aShouldEnable ? sBtInterface->enable() : sBtInterface->disable();
NS_ENSURE_TRUE(ret == BT_STATUS_SUCCESS, NS_ERROR_FAILURE); NS_ENSURE_TRUE(ret == BT_STATUS_SUCCESS, NS_ERROR_FAILURE);
MonitorAutoLock lock(*sToggleBtMonitor);
lock.Wait();
return NS_OK; return NS_OK;
} }
@ -716,8 +719,6 @@ ReplyStatusError(BluetoothReplyRunnable* aBluetoothReplyRunnable,
*/ */
BluetoothServiceBluedroid::BluetoothServiceBluedroid() BluetoothServiceBluedroid::BluetoothServiceBluedroid()
{ {
sToggleBtMonitor = new Monitor("BluetoothService.sToggleBtMonitor");
if (!EnsureBluetoothHalLoad()) { if (!EnsureBluetoothHalLoad()) {
BT_LOGR("Error! Failed to load bluedroid library."); BT_LOGR("Error! Failed to load bluedroid library.");
return; return;
@ -731,7 +732,6 @@ BluetoothServiceBluedroid::BluetoothServiceBluedroid()
BluetoothServiceBluedroid::~BluetoothServiceBluedroid() BluetoothServiceBluedroid::~BluetoothServiceBluedroid()
{ {
sToggleBtMonitor = nullptr;
} }
nsresult nsresult
@ -741,18 +741,14 @@ BluetoothServiceBluedroid::StartInternal()
nsresult ret = StartStopGonkBluetooth(true); nsresult ret = StartStopGonkBluetooth(true);
if (NS_FAILED(ret)) { if (NS_FAILED(ret)) {
nsCOMPtr<nsIRunnable> ackTask = new BluetoothService::ToggleBtAck(false); nsRefPtr<nsRunnable> runnable =
if (NS_FAILED(NS_DispatchToMainThread(ackTask))) { new BluetoothService::ToggleBtAck(false);
if (NS_FAILED(NS_DispatchToMainThread(runnable))) {
BT_WARNING("Failed to dispatch to main thread!"); BT_WARNING("Failed to dispatch to main thread!");
} }
BT_LOGR("Error"); BT_LOGR("Error");
} }
nsCOMPtr<nsIRunnable> ackTask = new BluetoothService::ToggleBtAck(true);
if (NS_FAILED(NS_DispatchToMainThread(ackTask))) {
BT_WARNING("Failed to dispatch to main thread!");
}
return ret; return ret;
} }
@ -763,18 +759,14 @@ BluetoothServiceBluedroid::StopInternal()
nsresult ret = StartStopGonkBluetooth(false); nsresult ret = StartStopGonkBluetooth(false);
if (NS_FAILED(ret)) { if (NS_FAILED(ret)) {
nsCOMPtr<nsIRunnable> ackTask = new BluetoothService::ToggleBtAck(true); nsRefPtr<nsRunnable> runnable =
if (NS_FAILED(NS_DispatchToMainThread(ackTask))) { new BluetoothService::ToggleBtAck(true);
if (NS_FAILED(NS_DispatchToMainThread(runnable))) {
BT_WARNING("Failed to dispatch to main thread!"); BT_WARNING("Failed to dispatch to main thread!");
} }
BT_LOGR("Error"); BT_LOGR("Error");
} }
nsCOMPtr<nsIRunnable> ackTask = new BluetoothService::ToggleBtAck(false);
if (NS_FAILED(NS_DispatchToMainThread(ackTask))) {
BT_WARNING("Failed to dispatch to main thread!");
}
return ret; return ret;
} }