Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d298fb88 authored by Marco Nelissen's avatar Marco Nelissen Committed by Android (Google) Code Review
Browse files

Merge "IMediaExtractor: protect access to extractor info list" into nyc-dev

parents bc0c73e0 8d27f5e1
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -216,13 +216,15 @@ String8 ExtractorInstance::toString() const {
    return str;
}

static Vector<ExtractorInstance> extractors;
static Vector<ExtractorInstance> sExtractors;
static Mutex sExtractorsLock;

void registerMediaSource(
        const sp<IMediaExtractor> &ex,
        const sp<IMediaSource> &source) {
    for (size_t i = 0; i < extractors.size(); i++) {
        ExtractorInstance &instance = extractors.editItemAt(i);
    Mutex::Autolock lock(sExtractorsLock);
    for (size_t i = 0; i < sExtractors.size(); i++) {
        ExtractorInstance &instance = sExtractors.editItemAt(i);
        sp<IMediaExtractor> extractor = instance.extractor.promote();
        if (extractor != NULL && extractor == ex) {
            if (instance.tracks.size() > 5) {
@@ -246,20 +248,26 @@ void registerMediaExtractor(
    ex.owner = IPCThreadState::self()->getCallingPid();
    ex.extractor = extractor;

    if (extractors.size() > 10) {
        extractors.resize(10);
    {
        Mutex::Autolock lock(sExtractorsLock);
        if (sExtractors.size() > 10) {
            sExtractors.resize(10);
        }
        sExtractors.push_front(ex);
    }
    extractors.push_front(ex);
}

status_t dumpExtractors(int fd, const Vector<String16>&) {
    String8 out;
    out.append("Recent extractors, most recent first:\n");
    for (size_t i = 0; i < extractors.size(); i++) {
        const ExtractorInstance &instance = extractors.itemAt(i);
    {
        Mutex::Autolock lock(sExtractorsLock);
        for (size_t i = 0; i < sExtractors.size(); i++) {
            const ExtractorInstance &instance = sExtractors.itemAt(i);
            out.append("  ");
            out.append(instance.toString());
        }
    }
    write(fd, out.string(), out.size());
    return OK;
}