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

Commit b9135638 authored by Mike Lockwood's avatar Mike Lockwood
Browse files

DO NOT MERGE Fix deadlock in MountService



It is not safe to call into vold with a lock held on mVolumeStates
since we will receive events back from vold on a different thread.
So in the boot completed handler we make a copy of the volume list and
then call vold to mount volumes after releasing the lock

Change-Id: Ic9836c2e1e8a5677d0c4e33476a72081f69823a0
Signed-off-by: default avatarMike Lockwood <lockwood@android.com>
parent d967f466
Loading
Loading
Loading
Loading
+32 −17
Original line number Diff line number Diff line
@@ -444,16 +444,32 @@ class MountService extends IMountService.Stub implements INativeDaemonConnectorC
                 * to make the media scanner run.
                 */
                if ("simulator".equals(SystemProperties.get("ro.product.device"))) {
                    notifyVolumeStateChange(null, "/sdcard", VolumeState.NoMedia, VolumeState.Mounted);
                    notifyVolumeStateChange(null, "/sdcard", VolumeState.NoMedia,
                            VolumeState.Mounted);
                    return;
                }
                new Thread() {
                    @Override
                    public void run() {
                        try {
                            // it is not safe to call vold with mVolumeStates locked
                            // so we make a copy of the paths and states and process them
                            // outside the lock
                            String[] paths, states;
                            int count;
                            synchronized (mVolumeStates) {
                                for (String path : mVolumeStates.keySet()) {
                                    String state = mVolumeStates.get(path);
                                Set<String> keys = mVolumeStates.keySet();
                                count = keys.size();
                                paths = (String[])keys.toArray(new String[count]);
                                states = new String[count];
                                for (int i = 0; i < count; i++) {
                                    states[i] = mVolumeStates.get(paths[i]);
                                }
                            }

                            for (int i = 0; i < count; i++) {
                                String path = paths[i];
                                String state = states[i];

                                if (state.equals(Environment.MEDIA_UNMOUNTED)) {
                                    int rc = doMountVolume(path);
@@ -470,7 +486,6 @@ class MountService extends IMountService.Stub implements INativeDaemonConnectorC
                                            VolumeState.Shared);
                                }
                            }
                            }

                            /*
                             * If UMS was connected on boot, send the connected event