Merge "media.bufferpool2: Ensure uniqueness of connection id" into main am: e540e3385d
Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/3118258 Change-Id: I15540b657902daa97eb6a2027d85f7921f3991f8 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
commit
4e10251c1d
3 changed files with 34 additions and 8 deletions
|
@ -16,6 +16,8 @@
|
|||
#define LOG_TAG "AidlBufferPoolAcc"
|
||||
//#define LOG_NDEBUG 0
|
||||
|
||||
#include <android-base/no_destructor.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
|
@ -41,7 +43,25 @@ static constexpr uint32_t kSeqIdVndkBit = 0;
|
|||
#endif
|
||||
|
||||
static constexpr uint32_t kSeqIdMax = 0x7fffffff;
|
||||
uint32_t Accessor::sSeqId = time(nullptr) & kSeqIdMax;
|
||||
|
||||
Accessor::ConnectionIdGenerator::ConnectionIdGenerator() {
|
||||
mSeqId = static_cast<uint32_t>(time(nullptr) & kSeqIdMax);
|
||||
mPid = static_cast<int32_t>(getpid());
|
||||
}
|
||||
|
||||
ConnectionId Accessor::ConnectionIdGenerator::getConnectionId() {
|
||||
uint32_t seq;
|
||||
{
|
||||
std::lock_guard<std::mutex> l(mLock);
|
||||
seq = mSeqId;
|
||||
if (mSeqId == kSeqIdMax) {
|
||||
mSeqId = 0;
|
||||
} else {
|
||||
++mSeqId;
|
||||
}
|
||||
}
|
||||
return (int64_t)mPid << 32 | seq | kSeqIdVndkBit;
|
||||
}
|
||||
|
||||
namespace {
|
||||
// anonymous namespace
|
||||
|
@ -239,13 +259,14 @@ BufferPoolStatus Accessor::connect(
|
|||
uint32_t *pMsgId,
|
||||
StatusDescriptor* statusDescPtr,
|
||||
InvalidationDescriptor* invDescPtr) {
|
||||
static ::android::base::NoDestructor<ConnectionIdGenerator> sConIdGenerator;
|
||||
std::shared_ptr<Connection> newConnection = ::ndk::SharedRefBase::make<Connection>();
|
||||
BufferPoolStatus status = ResultStatus::CRITICAL_ERROR;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mBufferPool.mMutex);
|
||||
if (newConnection) {
|
||||
int32_t pid = getpid();
|
||||
ConnectionId id = (int64_t)pid << 32 | sSeqId | kSeqIdVndkBit;
|
||||
ConnectionId id = sConIdGenerator->getConnectionId();
|
||||
status = mBufferPool.mObserver.open(id, statusDescPtr);
|
||||
if (status == ResultStatus::OK) {
|
||||
newConnection->initialize(ref<Accessor>(), id);
|
||||
|
@ -255,11 +276,6 @@ BufferPoolStatus Accessor::connect(
|
|||
mBufferPool.mConnectionIds.insert(id);
|
||||
mBufferPool.mInvalidationChannel.getDesc(invDescPtr);
|
||||
mBufferPool.mInvalidation.onConnect(id, observer);
|
||||
if (sSeqId == kSeqIdMax) {
|
||||
sSeqId = 0;
|
||||
} else {
|
||||
++sSeqId;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -189,7 +189,14 @@ struct Accessor : public BnAccessor {
|
|||
private:
|
||||
// ConnectionId = pid : (timestamp_created + seqId)
|
||||
// in order to guarantee uniqueness for each connection
|
||||
static uint32_t sSeqId;
|
||||
struct ConnectionIdGenerator {
|
||||
int32_t mPid;
|
||||
uint32_t mSeqId;
|
||||
std::mutex mLock;
|
||||
|
||||
ConnectionIdGenerator();
|
||||
ConnectionId getConnectionId();
|
||||
};
|
||||
|
||||
const std::shared_ptr<BufferPoolAllocator> mAllocator;
|
||||
nsecs_t mScheduleEvictTs;
|
||||
|
|
|
@ -29,6 +29,9 @@ cc_library {
|
|||
export_include_dirs: [
|
||||
"include",
|
||||
],
|
||||
header_libs: [
|
||||
"libbase_headers",
|
||||
],
|
||||
shared_libs: [
|
||||
"libbinder_ndk",
|
||||
"libcutils",
|
||||
|
|
Loading…
Reference in a new issue