summaryrefslogtreecommitdiffstats
path: root/media/mtp
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2010-07-20 09:48:35 -0400
committerMike Lockwood <lockwood@android.com>2010-07-20 09:49:50 -0400
commit941f1132dd76a959f17aaefd1ac2c0c6cc27a444 (patch)
tree7359ce6eccaa463fe9886ad7ea828ee21cab8043 /media/mtp
parent5cdceca217319bf6a22caf1acadc38c8dc259316 (diff)
downloadframeworks_av-941f1132dd76a959f17aaefd1ac2c0c6cc27a444.zip
frameworks_av-941f1132dd76a959f17aaefd1ac2c0c6cc27a444.tar.gz
frameworks_av-941f1132dd76a959f17aaefd1ac2c0c6cc27a444.tar.bz2
MTP: Remove race condition in initial device enumeration for host mode.
Change-Id: Iee01aaae3f8cca4234daa289bef6631da4d6c2b6 Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media/mtp')
-rw-r--r--media/mtp/MtpClient.cpp36
-rw-r--r--media/mtp/MtpClient.h6
2 files changed, 31 insertions, 11 deletions
diff --git a/media/mtp/MtpClient.cpp b/media/mtp/MtpClient.cpp
index b4c47af..8d10c27 100644
--- a/media/mtp/MtpClient.cpp
+++ b/media/mtp/MtpClient.cpp
@@ -27,7 +27,6 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
-#include <utils/threads.h>
#include <usbhost/usbhost.h>
#include <linux/version.h>
@@ -67,6 +66,8 @@ MtpClient::~MtpClient() {
}
bool MtpClient::start() {
+ Mutex::Autolock autoLock(mMutex);
+
if (mThread)
return true;
@@ -76,6 +77,8 @@ bool MtpClient::start() {
mThread = new MtpClientThread(this);
mThread->run("MtpClientThread");
+ // wait for the thread to do initial device discovery before returning
+ mThreadStartCondition.wait(mMutex);
return true;
}
@@ -84,6 +87,15 @@ void MtpClient::stop() {
mDone = true;
}
+MtpDevice* MtpClient::getDevice(int id) {
+ for (int i = 0; i < mDeviceList.size(); i++) {
+ MtpDevice* device = mDeviceList[i];
+ if (device->getID() == id)
+ return device;
+ }
+ return NULL;
+}
+
bool MtpClient::usbDeviceAdded(const char *devname) {
struct usb_descriptor_header* desc;
struct usb_descriptor_iter iter;
@@ -159,15 +171,6 @@ bool MtpClient::usbDeviceAdded(const char *devname) {
return mDone;
}
-MtpDevice* MtpClient::getDevice(int id) {
- for (int i = 0; i < mDeviceList.size(); i++) {
- MtpDevice* device = mDeviceList[i];
- if (device->getID() == id)
- return device;
- }
- return NULL;
-}
-
bool MtpClient::usbDeviceRemoved(const char *devname) {
for (int i = 0; i < mDeviceList.size(); i++) {
MtpDevice* device = mDeviceList[i];
@@ -182,8 +185,14 @@ bool MtpClient::usbDeviceRemoved(const char *devname) {
return mDone;
}
+bool MtpClient::usbDiscoveryDone() {
+ Mutex::Autolock autoLock(mMutex);
+ mThreadStartCondition.signal();
+ return mDone;
+}
+
bool MtpClient::threadLoop() {
- usb_host_run(mUsbHostContext, usb_device_added, usb_device_removed, this);
+ usb_host_run(mUsbHostContext, usb_device_added, usb_device_removed, usb_discovery_done, this);
return false;
}
@@ -197,4 +206,9 @@ int MtpClient::usb_device_removed(const char *devname, void* client_data) {
return ((MtpClient *)client_data)->usbDeviceRemoved(devname);
}
+int MtpClient::usb_discovery_done(void* client_data) {
+ LOGD("usb_discovery_done\n");
+ return ((MtpClient *)client_data)->usbDiscoveryDone();
+}
+
} // namespace android
diff --git a/media/mtp/MtpClient.h b/media/mtp/MtpClient.h
index 907a80b..fa5c527 100644
--- a/media/mtp/MtpClient.h
+++ b/media/mtp/MtpClient.h
@@ -19,6 +19,8 @@
#include "MtpTypes.h"
+#include <utils/threads.h>
+
struct usb_host_context;
namespace android {
@@ -29,6 +31,8 @@ class MtpClient {
private:
MtpDeviceList mDeviceList;
MtpClientThread* mThread;
+ Condition mThreadStartCondition;
+ Mutex mMutex;
struct usb_host_context* mUsbHostContext;
bool mDone;
@@ -50,11 +54,13 @@ private:
// these return true if we should stop monitoring USB and clean up
bool usbDeviceAdded(const char *devname);
bool usbDeviceRemoved(const char *devname);
+ bool usbDiscoveryDone();
friend class MtpClientThread;
bool threadLoop();
static int usb_device_added(const char *devname, void* client_data);
static int usb_device_removed(const char *devname, void* client_data);
+ static int usb_discovery_done(void* client_data);
};
}; // namespace android