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

Commit 511e4872 authored by Diego Perez's avatar Diego Perez
Browse files

Make DelegateManager thread safe

We have been seeing crashes on the Theme editor related to an assertion
on getDelegate when the object does not exist
(http://b.android.com/181951).
When debugging, the crash was happening without seeing a previous call
to removeJavaReference. This seems to completely remove that crash.
Since the DelegateManager can be called at least from two threads
(main thread and the finalizer), it should be thread safe.

Bug: http://b.android.com/181951
Change-Id: I1b28f863ff198f8592f170a98f9de391b2ac3ea2
parent d5a6df6d
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -97,13 +97,13 @@ public final class DelegateManager<T> {
     * @return the delegate or null if not found.
     */
    @Nullable
    public T getDelegate(long native_object) {
    public synchronized T getDelegate(long native_object) {
        if (native_object > 0) {
            T delegate = mDelegates.get(native_object);

            if (Debug.DEBUG) {
                if (delegate == null) {
                    System.out.println("Unknown " + mClass.getSimpleName() + " with int " +
                    System.err.println("Unknown " + mClass.getSimpleName() + " with int " +
                            native_object);
                }
            }
@@ -119,14 +119,18 @@ public final class DelegateManager<T> {
     * @param newDelegate the delegate to add
     * @return a unique native int to identify the delegate
     */
    public long addNewDelegate(T newDelegate) {
    public synchronized long addNewDelegate(T newDelegate) {
        long native_object = ++mDelegateCounter;

        mDelegates.put(native_object, newDelegate);
        assert !mJavaReferences.contains(newDelegate);
        mJavaReferences.add(newDelegate);

        if (Debug.DEBUG) {
            System.out.println("New " + mClass.getSimpleName() + " with int " + native_object);
            System.out.println(
                    "New " + mClass.getSimpleName() + " " +
                            "with int " +
                            native_object);
        }

        return native_object;
@@ -136,7 +140,7 @@ public final class DelegateManager<T> {
     * Removes the main reference on the given delegate.
     * @param native_object the native integer representing the delegate.
     */
    public void removeJavaReferenceFor(long native_object) {
    public synchronized void removeJavaReferenceFor(long native_object) {
        T delegate = getDelegate(native_object);

        if (Debug.DEBUG) {