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

Commit 67d876b1 authored by Pawin Vongmasa's avatar Pawin Vongmasa Committed by android-build-merger
Browse files

Merge "Protect against possible race conditions" into oc-dev am: 21076bf3...

Merge "Protect against possible race conditions" into oc-dev am: 21076bf3 am: dc31a5d4 am: 516a132e
am: db42765c

Change-Id: Ibda6f5f36af85be82f6f09e3d9f55ae50bed9abe
parents 19d6df66 db42765c
Loading
Loading
Loading
Loading
+57 −41
Original line number Diff line number Diff line
@@ -582,17 +582,14 @@ MediaPlayerService::Client::Client(
MediaPlayerService::Client::~Client()
{
    ALOGV("Client(%d) destructor pid = %d", mConnId, mPid);
    {
        Mutex::Autolock l(mLock);
    mAudioOutput.clear();
    }
    wp<Client> client(this);
    disconnect();
    mService->removeClient(client);
    if (mAudioAttributes != NULL) {
        free(mAudioAttributes);
    }
    clearDeathNotifiers();
    clearDeathNotifiers_l();
}

void MediaPlayerService::Client::disconnect()
@@ -620,7 +617,10 @@ void MediaPlayerService::Client::disconnect()
        p->reset();
    }

    disconnectNativeWindow();
    {
        Mutex::Autolock l(mLock);
        disconnectNativeWindow_l();
    }

    IPCThreadState::self()->flushCommands();
}
@@ -697,7 +697,7 @@ void MediaPlayerService::Client::ServiceDeathNotifier::unlinkToDeath() {
    }
}

void MediaPlayerService::Client::clearDeathNotifiers() {
void MediaPlayerService::Client::clearDeathNotifiers_l() {
    if (mExtractorDeathListener != nullptr) {
        mExtractorDeathListener->unlinkToDeath();
        mExtractorDeathListener = nullptr;
@@ -712,7 +712,6 @@ sp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre(
        player_type playerType)
{
    ALOGV("player type = %d", playerType);
    clearDeathNotifiers();

    // create the right type of player
    sp<MediaPlayerBase> p = createPlayer(playerType);
@@ -726,9 +725,11 @@ sp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre(
        ALOGE("extractor service not available");
        return NULL;
    }
    mExtractorDeathListener = new ServiceDeathNotifier(binder, p, MEDIAEXTRACTOR_PROCESS_DEATH);
    binder->linkToDeath(mExtractorDeathListener);
    sp<ServiceDeathNotifier> extractorDeathListener =
            new ServiceDeathNotifier(binder, p, MEDIAEXTRACTOR_PROCESS_DEATH);
    binder->linkToDeath(extractorDeathListener);

    sp<ServiceDeathNotifier> codecDeathListener;
    if (property_get_bool("persist.media.treble_omx", true)) {
        // Treble IOmx
        sp<IOmx> omx = IOmx::getService();
@@ -736,8 +737,8 @@ sp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre(
            ALOGE("Treble IOmx not available");
            return NULL;
        }
        mCodecDeathListener = new ServiceDeathNotifier(omx, p, MEDIACODEC_PROCESS_DEATH);
        omx->linkToDeath(mCodecDeathListener, 0);
        codecDeathListener = new ServiceDeathNotifier(omx, p, MEDIACODEC_PROCESS_DEATH);
        omx->linkToDeath(codecDeathListener, 0);
    } else {
        // Legacy IOMX
        binder = sm->getService(String16("media.codec"));
@@ -745,12 +746,17 @@ sp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre(
            ALOGE("codec service not available");
            return NULL;
        }
        mCodecDeathListener = new ServiceDeathNotifier(binder, p, MEDIACODEC_PROCESS_DEATH);
        binder->linkToDeath(mCodecDeathListener);
        codecDeathListener = new ServiceDeathNotifier(binder, p, MEDIACODEC_PROCESS_DEATH);
        binder->linkToDeath(codecDeathListener);
    }

    Mutex::Autolock lock(mLock);

    clearDeathNotifiers_l();
    mExtractorDeathListener = extractorDeathListener;
    mCodecDeathListener = codecDeathListener;

    if (!p->hardwareOutput()) {
        Mutex::Autolock l(mLock);
        mAudioOutput = new AudioOutput(mAudioSessionId, IPCThreadState::self()->getCallingUid(),
                mPid, mAudioAttributes);
        static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput);
@@ -759,29 +765,29 @@ sp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre(
    return p;
}

void MediaPlayerService::Client::setDataSource_post(
status_t MediaPlayerService::Client::setDataSource_post(
        const sp<MediaPlayerBase>& p,
        status_t status)
{
    ALOGV(" setDataSource");
    mStatus = status;
    if (mStatus != OK) {
        ALOGE("  error: %d", mStatus);
        return;
    if (status != OK) {
        ALOGE("  error: %d", status);
        return status;
    }

    // Set the re-transmission endpoint if one was chosen.
    if (mRetransmitEndpointValid) {
        mStatus = p->setRetransmitEndpoint(&mRetransmitEndpoint);
        if (mStatus != NO_ERROR) {
            ALOGE("setRetransmitEndpoint error: %d", mStatus);
        status = p->setRetransmitEndpoint(&mRetransmitEndpoint);
        if (status != NO_ERROR) {
            ALOGE("setRetransmitEndpoint error: %d", status);
        }
    }

    if (mStatus == OK) {
        Mutex::Autolock l(mLock);
    if (status == OK) {
        Mutex::Autolock lock(mLock);
        mPlayer = p;
    }
    return status;
}

status_t MediaPlayerService::Client::setDataSource(
@@ -812,9 +818,9 @@ status_t MediaPlayerService::Client::setDataSource(
            ALOGE("Couldn't open fd for %s", url);
            return UNKNOWN_ERROR;
        }
        setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus
        status_t status = setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus
        close(fd);
        return mStatus;
        return mStatus = status;
    } else {
        player_type playerType = MediaPlayerFactory::getPlayerType(this, url);
        sp<MediaPlayerBase> p = setDataSource_pre(playerType);
@@ -822,8 +828,9 @@ status_t MediaPlayerService::Client::setDataSource(
            return NO_INIT;
        }

        setDataSource_post(p, p->setDataSource(httpService, url, headers));
        return mStatus;
        return mStatus =
                setDataSource_post(
                p, p->setDataSource(httpService, url, headers));
    }
}

@@ -863,8 +870,7 @@ status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64
    }

    // now set data source
    setDataSource_post(p, p->setDataSource(fd, offset, length));
    return mStatus;
    return mStatus = setDataSource_post(p, p->setDataSource(fd, offset, length));
}

status_t MediaPlayerService::Client::setDataSource(
@@ -877,8 +883,7 @@ status_t MediaPlayerService::Client::setDataSource(
    }

    // now set data source
    setDataSource_post(p, p->setDataSource(source));
    return mStatus;
    return mStatus = setDataSource_post(p, p->setDataSource(source));
}

status_t MediaPlayerService::Client::setDataSource(
@@ -890,11 +895,10 @@ status_t MediaPlayerService::Client::setDataSource(
        return NO_INIT;
    }
    // now set data source
    setDataSource_post(p, p->setDataSource(dataSource));
    return mStatus;
    return mStatus = setDataSource_post(p, p->setDataSource(dataSource));
}

void MediaPlayerService::Client::disconnectNativeWindow() {
void MediaPlayerService::Client::disconnectNativeWindow_l() {
    if (mConnectedWindow != NULL) {
        status_t err = nativeWindowDisconnect(
                mConnectedWindow.get(), "disconnectNativeWindow");
@@ -931,7 +935,8 @@ status_t MediaPlayerService::Client::setVideoSurfaceTexture(
            // ANW, which may result in errors.
            reset();

            disconnectNativeWindow();
            Mutex::Autolock lock(mLock);
            disconnectNativeWindow_l();

            return err;
        }
@@ -942,14 +947,22 @@ status_t MediaPlayerService::Client::setVideoSurfaceTexture(
    // on the disconnected ANW, which may result in errors.
    status_t err = p->setVideoSurfaceTexture(bufferProducer);

    disconnectNativeWindow();

    mConnectedWindow = anw;
    mLock.lock();
    disconnectNativeWindow_l();

    if (err == OK) {
        mConnectedWindow = anw;
        mConnectedWindowBinder = binder;
        mLock.unlock();
    } else {
        disconnectNativeWindow();
        mLock.unlock();
        status_t err = nativeWindowDisconnect(
                anw.get(), "disconnectNativeWindow");

        if (err != OK) {
            ALOGW("nativeWindowDisconnect returned an error: %s (%d)",
                    strerror(-err), err);
        }
    }

    return err;
@@ -1375,9 +1388,11 @@ status_t MediaPlayerService::Client::setRetransmitEndpoint(
    if (p != 0) return INVALID_OPERATION;

    if (NULL != endpoint) {
        Mutex::Autolock lock(mLock);
        mRetransmitEndpoint = *endpoint;
        mRetransmitEndpointValid = true;
    } else {
        Mutex::Autolock lock(mLock);
        mRetransmitEndpointValid = false;
    }

@@ -1395,6 +1410,7 @@ status_t MediaPlayerService::Client::getRetransmitEndpoint(
    if (p != NULL)
        return p->getRetransmitEndpoint(endpoint);

    Mutex::Autolock lock(mLock);
    if (!mRetransmitEndpointValid)
        return NO_INIT;

+3 −3
Original line number Diff line number Diff line
@@ -361,7 +361,7 @@ private:


        sp<MediaPlayerBase>     setDataSource_pre(player_type playerType);
        void                    setDataSource_post(const sp<MediaPlayerBase>& p,
        status_t                setDataSource_post(const sp<MediaPlayerBase>& p,
                                                   status_t status);

        static  void            notify(void* cookie, int msg,
@@ -403,7 +403,7 @@ private:
            wp<MediaPlayerBase> mListener;
        };

        void clearDeathNotifiers();
        void clearDeathNotifiers_l();

        friend class MediaPlayerService;
                                Client( const sp<MediaPlayerService>& service,
@@ -432,7 +432,7 @@ private:
        void addNewMetadataUpdate(media::Metadata::Type type);

        // Disconnect from the currently connected ANativeWindow.
        void disconnectNativeWindow();
        void disconnectNativeWindow_l();

        status_t setAudioAttributes_l(const Parcel &request);

+3 −3
Original line number Diff line number Diff line
@@ -339,7 +339,7 @@ status_t MediaRecorderClient::release()
        wp<MediaRecorderClient> client(this);
        mMediaPlayerService->removeMediaRecorderClient(client);
    }
    clearDeathNotifiers();
    clearDeathNotifiers_l();
    return NO_ERROR;
}

@@ -411,7 +411,7 @@ void MediaRecorderClient::ServiceDeathNotifier::unlinkToDeath() {
    }
}

void MediaRecorderClient::clearDeathNotifiers() {
void MediaRecorderClient::clearDeathNotifiers_l() {
    if (mCameraDeathListener != nullptr) {
        mCameraDeathListener->unlinkToDeath();
        mCameraDeathListener = nullptr;
@@ -425,8 +425,8 @@ void MediaRecorderClient::clearDeathNotifiers() {
status_t MediaRecorderClient::setListener(const sp<IMediaRecorderClient>& listener)
{
    ALOGV("setListener");
    clearDeathNotifiers();
    Mutex::Autolock lock(mLock);
    clearDeathNotifiers_l();
    if (mRecorder == NULL) {
        ALOGE("recorder is not initialized");
        return NO_INIT;
+1 −1
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ class MediaRecorderClient : public BnMediaRecorder
        wp<IMediaRecorderClient> mListener;
    };

    void clearDeathNotifiers();
    void clearDeathNotifiers_l();

public:
    virtual     status_t   setCamera(const sp<hardware::ICamera>& camera,