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

Commit 8ce351a8 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Make some usages of SparseArray thread-safe

This is a follow up of I39d9bf1a7c272eb16d6ed4698f52457579b40f10.

Change-Id: Ic3288e491175f9a85679a21064093f9db5a65466
parent 4c6db059
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -64,19 +64,22 @@ public class BinaryDictionary extends Dictionary {

    private final SparseArray<DicTraverseSession> mDicTraverseSessions =
            new SparseArray<DicTraverseSession>();

    // TODO: There should be a way to remove used DicTraverseSession objects from
    // {@code mDicTraverseSessions}.
    private DicTraverseSession getTraverseSession(int traverseSessionId) {
        synchronized(mDicTraverseSessions) {
            DicTraverseSession traverseSession = mDicTraverseSessions.get(traverseSessionId);
            if (traverseSession == null) {
            synchronized(mDicTraverseSessions) {
                traverseSession = mDicTraverseSessions.get(traverseSessionId);
                if (traverseSession == null) {
                    traverseSession = new DicTraverseSession(mLocale, mNativeDict);
                    mDicTraverseSessions.put(traverseSessionId, traverseSession);
                }
            }
        }
            return traverseSession;
        }
    }

    /**
     * Constructor for the binary dictionary. This is supposed to be called from the
@@ -209,18 +212,20 @@ public class BinaryDictionary extends Dictionary {
    }

    @Override
    public synchronized void close() {
        for (int i = 0; i < mDicTraverseSessions.size(); ++i) {
            final int key = mDicTraverseSessions.keyAt(i);
            final DicTraverseSession traverseSession = mDicTraverseSessions.get(key);
    public void close() {
        synchronized (mDicTraverseSessions) {
            final int sessionsSize = mDicTraverseSessions.size();
            for (int index = 0; index < sessionsSize; ++index) {
                final DicTraverseSession traverseSession = mDicTraverseSessions.valueAt(index);
                if (traverseSession != null) {
                    traverseSession.close();
                }
            }
        }
        closeInternal();
    }

    private void closeInternal() {
    private synchronized void closeInternal() {
        if (mNativeDict != 0) {
            closeNative(mNativeDict);
            mNativeDict = 0;