Merge "Ensure OMX node ids are unique across processes" into nyc-dev
diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h
index e7c4f6d..9f2e5e7 100644
--- a/media/libstagefright/include/OMX.h
+++ b/media/libstagefright/include/OMX.h
@@ -166,13 +166,13 @@
Mutex mLock;
OMXMaster *mMaster;
- int32_t mNodeCounter;
+ size_t mNodeCounter;
KeyedVector<wp<IBinder>, OMXNodeInstance *> mLiveNodes;
KeyedVector<node_id, OMXNodeInstance *> mNodeIDToInstance;
KeyedVector<node_id, sp<CallbackDispatcher> > mDispatchers;
- node_id makeNodeID(OMXNodeInstance *instance);
+ node_id makeNodeID_l(OMXNodeInstance *instance);
OMXNodeInstance *findInstance(node_id node);
sp<CallbackDispatcher> findDispatcher(node_id node);
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 539b4e3..b3625b4 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -38,6 +38,9 @@
namespace android {
+// node ids are created by concatenating the pid with a 16-bit counter
+static size_t kMaxNodeInstances = (1 << 16);
+
////////////////////////////////////////////////////////////////////////////////
// This provides the underlying Thread used by CallbackDispatcher.
@@ -237,6 +240,11 @@
*node = 0;
+ if (mNodeIDToInstance.size() == kMaxNodeInstances) {
+ // all possible node IDs are in use
+ return NO_MEMORY;
+ }
+
OMXNodeInstance *instance = new OMXNodeInstance(this, observer, name);
OMX_COMPONENTTYPE *handle;
@@ -252,7 +260,7 @@
return StatusFromOMXError(err);
}
- *node = makeNodeID(instance);
+ *node = makeNodeID_l(instance);
mDispatchers.add(*node, new CallbackDispatcher(instance));
instance->setHandle(*node, handle);
@@ -690,10 +698,17 @@
return OMX_ErrorNone;
}
-OMX::node_id OMX::makeNodeID(OMXNodeInstance *instance) {
+OMX::node_id OMX::makeNodeID_l(OMXNodeInstance *instance) {
// mLock is already held.
- node_id node = (node_id)++mNodeCounter;
+ node_id prefix = node_id(getpid() << 16);
+ node_id node = 0;
+ do {
+ if (++mNodeCounter >= kMaxNodeInstances) {
+ mNodeCounter = 0; // OK to use because we're combining with the pid
+ }
+ node = node_id(prefix | mNodeCounter);
+ } while (mNodeIDToInstance.indexOfKey(node) >= 0);
mNodeIDToInstance.add(node, instance);
return node;