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

Commit 377c25b3 authored by Soonil Nagarkar's avatar Soonil Nagarkar Committed by Automerger Merge Worker
Browse files

DO NOT MERGE Don't lock listener delivery am: 8aea09fe

Change-Id: I0cc66c4170d9ef195442c9bc84380b14491e0bf4
parents 073f98fd 8aea09fe
Loading
Loading
Loading
Loading
+23 −13
Original line number Original line Diff line number Diff line
@@ -85,11 +85,13 @@ abstract class AbstractListenerManager<TRequest, TListener> {
        }
        }
    }
    }


    @GuardedBy("mListeners")
    private final Object mLock = new Object();
    private final ArrayMap<Object, Registration<TRequest, TListener>> mListeners =

    @GuardedBy("mLock")
    private volatile ArrayMap<Object, Registration<TRequest, TListener>> mListeners =
            new ArrayMap<>();
            new ArrayMap<>();


    @GuardedBy("mListeners")
    @GuardedBy("mLock")
    @Nullable
    @Nullable
    private TRequest mMergedRequest;
    private TRequest mMergedRequest;


@@ -129,10 +131,16 @@ abstract class AbstractListenerManager<TRequest, TListener> {
            throws RemoteException {
            throws RemoteException {
        Preconditions.checkNotNull(registration);
        Preconditions.checkNotNull(registration);


        synchronized (mListeners) {
        synchronized (mLock) {
            boolean initialRequest = mListeners.isEmpty();
            boolean initialRequest = mListeners.isEmpty();


            Registration<TRequest, TListener> oldRegistration = mListeners.put(key, registration);
            ArrayMap<Object, Registration<TRequest, TListener>> newListeners = new ArrayMap<>(
                    mListeners.size() + 1);
            newListeners.putAll(mListeners);
            Registration<TRequest, TListener> oldRegistration = newListeners.put(key,
                    registration);
            mListeners = newListeners;

            if (oldRegistration != null) {
            if (oldRegistration != null) {
                oldRegistration.unregister();
                oldRegistration.unregister();
            }
            }
@@ -151,8 +159,12 @@ abstract class AbstractListenerManager<TRequest, TListener> {
    }
    }


    public void removeListener(Object listener) throws RemoteException {
    public void removeListener(Object listener) throws RemoteException {
        synchronized (mListeners) {
        synchronized (mLock) {
            Registration<TRequest, TListener> oldRegistration = mListeners.remove(listener);
            ArrayMap<Object, Registration<TRequest, TListener>> newListeners = new ArrayMap<>(
                    mListeners);
            Registration<TRequest, TListener> oldRegistration = newListeners.remove(listener);
            mListeners = newListeners;

            if (oldRegistration == null) {
            if (oldRegistration == null) {
                return;
                return;
            }
            }
@@ -190,18 +202,16 @@ abstract class AbstractListenerManager<TRequest, TListener> {
    }
    }


    protected void execute(Consumer<TListener> operation) {
    protected void execute(Consumer<TListener> operation) {
        synchronized (mListeners) {
        for (Registration<TRequest, TListener> registration : mListeners.values()) {
        for (Registration<TRequest, TListener> registration : mListeners.values()) {
            registration.execute(operation);
            registration.execute(operation);
        }
        }
    }
    }
    }


    @GuardedBy("mListeners")
    @GuardedBy("mLock")
    @SuppressWarnings("unchecked")
    @SuppressWarnings("unchecked")
    @Nullable
    @Nullable
    private TRequest mergeRequests() {
    private TRequest mergeRequests() {
        Preconditions.checkState(Thread.holdsLock(mListeners));
        Preconditions.checkState(Thread.holdsLock(mLock));


        if (mListeners.isEmpty()) {
        if (mListeners.isEmpty()) {
            return null;
            return null;