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

Commit 5d2ad7cd authored by Eric Laurent's avatar Eric Laurent Committed by Naveen Kumar
Browse files

Radio: get service by value

Get strong pointer to service interface by value and not reference to
prevent race conditions where the service pointer can be cleared
by another thread while in use.

Bug: 30907212
Change-Id: Iae838b3b672562c1d0cd63968399a6bfdda7f5ab
(cherry picked from commit 28a0e9ec)
(cherry picked from commit bd04b47d38a89f1dada1c6da2ef4a3d235c166b8)
parent f03d82f2
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -75,7 +75,7 @@ public:
private:
private:
            Radio(radio_handle_t handle,
            Radio(radio_handle_t handle,
                            const sp<RadioCallback>&);
                            const sp<RadioCallback>&);
            static const sp<IRadioService>& getRadioService();
            static const sp<IRadioService> getRadioService();


            Mutex                   mLock;
            Mutex                   mLock;
            sp<IRadio>              mIRadio;
            sp<IRadio>              mIRadio;
+3 −3
Original line number Original line Diff line number Diff line
@@ -55,7 +55,7 @@ namespace {
    sp<DeathNotifier>         gDeathNotifier;
    sp<DeathNotifier>         gDeathNotifier;
}; // namespace anonymous
}; // namespace anonymous


const sp<IRadioService>& Radio::getRadioService()
const sp<IRadioService> Radio::getRadioService()
{
{
    Mutex::Autolock _l(gLock);
    Mutex::Autolock _l(gLock);
    if (gRadioService.get() == 0) {
    if (gRadioService.get() == 0) {
@@ -84,7 +84,7 @@ status_t Radio::listModules(struct radio_properties *properties,
                            uint32_t *numModules)
                            uint32_t *numModules)
{
{
    ALOGV("listModules()");
    ALOGV("listModules()");
    const sp<IRadioService>& service = getRadioService();
    const sp<IRadioService> service = getRadioService();
    if (service == 0) {
    if (service == 0) {
        return NO_INIT;
        return NO_INIT;
    }
    }
@@ -98,7 +98,7 @@ sp<Radio> Radio::attach(radio_handle_t handle,
{
{
    ALOGV("attach()");
    ALOGV("attach()");
    sp<Radio> radio;
    sp<Radio> radio;
    const sp<IRadioService>& service = getRadioService();
    const sp<IRadioService> service = getRadioService();
    if (service == 0) {
    if (service == 0) {
        return radio;
        return radio;
    }
    }