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

Commit 0a675128 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 am: 360b613a am: cdf8ddc4

Change-Id: I4be8a22d7fa4f14a769e9feee23ecfa0ad59378a
parents df5b0919 cdf8ddc4
Loading
Loading
Loading
Loading
+23 −13
Original line number Diff line number Diff line
@@ -85,11 +85,13 @@ abstract class AbstractListenerManager<TRequest, TListener> {
        }
    }

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

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

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

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

        synchronized (mListeners) {
        synchronized (mLock) {
            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) {
                oldRegistration.unregister();
            }
@@ -151,8 +159,12 @@ abstract class AbstractListenerManager<TRequest, TListener> {
    }

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

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

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

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

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