Loading services/core/java/com/android/server/accounts/AccountManagerService.java +53 −36 Original line number Original line Diff line number Diff line Loading @@ -782,7 +782,12 @@ public class AccountManagerService long identityToken = clearCallingIdentity(); long identityToken = clearCallingIdentity(); try { try { UserAccounts accounts = getUserAccounts(userId); UserAccounts accounts = getUserAccounts(userId); return readUserDataInternal(accounts, account, key); synchronized (accounts.cacheLock) { if (!accountExistsCacheLocked(accounts, account)) { return null; } return readUserDataInternalLocked(accounts, account, key); } } finally { } finally { restoreCallingIdentity(identityToken); restoreCallingIdentity(identityToken); } } Loading Loading @@ -1869,19 +1874,34 @@ public class AccountManagerService long identityToken = clearCallingIdentity(); long identityToken = clearCallingIdentity(); try { try { UserAccounts accounts = getUserAccounts(userId); UserAccounts accounts = getUserAccounts(userId); setUserdataInternal(accounts, account, key, value); synchronized (accounts.cacheLock) { if (!accountExistsCacheLocked(accounts, account)) { return; } setUserdataInternalLocked(accounts, account, key, value); } } finally { } finally { restoreCallingIdentity(identityToken); restoreCallingIdentity(identityToken); } } } } private void setUserdataInternal(UserAccounts accounts, Account account, String key, private boolean accountExistsCacheLocked(UserAccounts accounts, Account account) { if (accounts.accountCache.containsKey(account.type)) { for (Account acc : accounts.accountCache.get(account.type)) { if (acc.name.equals(account.name)) { return true; } } } return false; } private void setUserdataInternalLocked(UserAccounts accounts, Account account, String key, String value) { String value) { if (account == null || key == null) { if (account == null || key == null) { return; return; } } synchronized (accounts.cacheLock) { final SQLiteDatabase db = accounts.openHelper.getWritableDatabase(); final SQLiteDatabase db = accounts.openHelper.getWritableDatabaseUserIsUnlocked(); db.beginTransaction(); db.beginTransaction(); try { try { long accountId = getAccountIdLocked(db, account); long accountId = getAccountIdLocked(db, account); Loading @@ -1897,10 +1917,9 @@ public class AccountManagerService } else { } else { ContentValues values = new ContentValues(); ContentValues values = new ContentValues(); values.put(EXTRAS_VALUE, value); values.put(EXTRAS_VALUE, value); if (1 != db.update(CE_TABLE_EXTRAS, values, EXTRAS_ID + "=" + extrasId, null)) { if (1 != db.update(TABLE_EXTRAS, values, EXTRAS_ID + "=" + extrasId, null)) { return; return; } } } } writeUserDataIntoCacheLocked(accounts, db, account, key, value); writeUserDataIntoCacheLocked(accounts, db, account, key, value); db.setTransactionSuccessful(); db.setTransactionSuccessful(); Loading @@ -1908,7 +1927,6 @@ public class AccountManagerService db.endTransaction(); db.endTransaction(); } } } } } private void onResult(IAccountManagerResponse response, Bundle result) { private void onResult(IAccountManagerResponse response, Bundle result) { if (result == null) { if (result == null) { Loading Loading @@ -5292,18 +5310,17 @@ public class AccountManagerService } } } } protected String readUserDataInternal(UserAccounts accounts, Account account, String key) { protected String readUserDataInternalLocked( synchronized (accounts.cacheLock) { UserAccounts accounts, Account account, String key) { HashMap<String, String> userDataForAccount = accounts.userDataCache.get(account); HashMap<String, String> userDataForAccount = accounts.userDataCache.get(account); if (userDataForAccount == null) { if (userDataForAccount == null) { // need to populate the cache for this account // need to populate the cache for this account final SQLiteDatabase db = accounts.openHelper.getReadableDatabaseUserIsUnlocked(); final SQLiteDatabase db = accounts.openHelper.getReadableDatabase(); userDataForAccount = readUserDataForAccountFromDatabaseLocked(db, account); userDataForAccount = readUserDataForAccountFromDatabaseLocked(db, account); accounts.userDataCache.put(account, userDataForAccount); accounts.userDataCache.put(account, userDataForAccount); } } return userDataForAccount.get(key); return userDataForAccount.get(key); } } } protected HashMap<String, String> readUserDataForAccountFromDatabaseLocked( protected HashMap<String, String> readUserDataForAccountFromDatabaseLocked( final SQLiteDatabase db, Account account) { final SQLiteDatabase db, Account account) { Loading Loading
services/core/java/com/android/server/accounts/AccountManagerService.java +53 −36 Original line number Original line Diff line number Diff line Loading @@ -782,7 +782,12 @@ public class AccountManagerService long identityToken = clearCallingIdentity(); long identityToken = clearCallingIdentity(); try { try { UserAccounts accounts = getUserAccounts(userId); UserAccounts accounts = getUserAccounts(userId); return readUserDataInternal(accounts, account, key); synchronized (accounts.cacheLock) { if (!accountExistsCacheLocked(accounts, account)) { return null; } return readUserDataInternalLocked(accounts, account, key); } } finally { } finally { restoreCallingIdentity(identityToken); restoreCallingIdentity(identityToken); } } Loading Loading @@ -1869,19 +1874,34 @@ public class AccountManagerService long identityToken = clearCallingIdentity(); long identityToken = clearCallingIdentity(); try { try { UserAccounts accounts = getUserAccounts(userId); UserAccounts accounts = getUserAccounts(userId); setUserdataInternal(accounts, account, key, value); synchronized (accounts.cacheLock) { if (!accountExistsCacheLocked(accounts, account)) { return; } setUserdataInternalLocked(accounts, account, key, value); } } finally { } finally { restoreCallingIdentity(identityToken); restoreCallingIdentity(identityToken); } } } } private void setUserdataInternal(UserAccounts accounts, Account account, String key, private boolean accountExistsCacheLocked(UserAccounts accounts, Account account) { if (accounts.accountCache.containsKey(account.type)) { for (Account acc : accounts.accountCache.get(account.type)) { if (acc.name.equals(account.name)) { return true; } } } return false; } private void setUserdataInternalLocked(UserAccounts accounts, Account account, String key, String value) { String value) { if (account == null || key == null) { if (account == null || key == null) { return; return; } } synchronized (accounts.cacheLock) { final SQLiteDatabase db = accounts.openHelper.getWritableDatabase(); final SQLiteDatabase db = accounts.openHelper.getWritableDatabaseUserIsUnlocked(); db.beginTransaction(); db.beginTransaction(); try { try { long accountId = getAccountIdLocked(db, account); long accountId = getAccountIdLocked(db, account); Loading @@ -1897,10 +1917,9 @@ public class AccountManagerService } else { } else { ContentValues values = new ContentValues(); ContentValues values = new ContentValues(); values.put(EXTRAS_VALUE, value); values.put(EXTRAS_VALUE, value); if (1 != db.update(CE_TABLE_EXTRAS, values, EXTRAS_ID + "=" + extrasId, null)) { if (1 != db.update(TABLE_EXTRAS, values, EXTRAS_ID + "=" + extrasId, null)) { return; return; } } } } writeUserDataIntoCacheLocked(accounts, db, account, key, value); writeUserDataIntoCacheLocked(accounts, db, account, key, value); db.setTransactionSuccessful(); db.setTransactionSuccessful(); Loading @@ -1908,7 +1927,6 @@ public class AccountManagerService db.endTransaction(); db.endTransaction(); } } } } } private void onResult(IAccountManagerResponse response, Bundle result) { private void onResult(IAccountManagerResponse response, Bundle result) { if (result == null) { if (result == null) { Loading Loading @@ -5292,18 +5310,17 @@ public class AccountManagerService } } } } protected String readUserDataInternal(UserAccounts accounts, Account account, String key) { protected String readUserDataInternalLocked( synchronized (accounts.cacheLock) { UserAccounts accounts, Account account, String key) { HashMap<String, String> userDataForAccount = accounts.userDataCache.get(account); HashMap<String, String> userDataForAccount = accounts.userDataCache.get(account); if (userDataForAccount == null) { if (userDataForAccount == null) { // need to populate the cache for this account // need to populate the cache for this account final SQLiteDatabase db = accounts.openHelper.getReadableDatabaseUserIsUnlocked(); final SQLiteDatabase db = accounts.openHelper.getReadableDatabase(); userDataForAccount = readUserDataForAccountFromDatabaseLocked(db, account); userDataForAccount = readUserDataForAccountFromDatabaseLocked(db, account); accounts.userDataCache.put(account, userDataForAccount); accounts.userDataCache.put(account, userDataForAccount); } } return userDataForAccount.get(key); return userDataForAccount.get(key); } } } protected HashMap<String, String> readUserDataForAccountFromDatabaseLocked( protected HashMap<String, String> readUserDataForAccountFromDatabaseLocked( final SQLiteDatabase db, Account account) { final SQLiteDatabase db, Account account) { Loading