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

Commit cb2362ce authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Make some usages of SparseArray thread-safe" into jb-mr1-dev

parents 2cd248ee 8ce351a8
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;