// Generate a new key that is added to wallet
string strAddress = PubKeyToAddress(pwalletMain->GetKeyFromKeyPool());
- pwalletMain->SetAddressBookName(strAddress, strAccount);
+ // This could be done in the same main CS as GetKeyFromKeyPool.
+ CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
+ pwalletMain->SetAddressBookName(strAddress, strAccount);
+
return strAddress;
}
-// requires cs_main, cs_mapWallet locks
+// requires cs_main, cs_mapWallet, cs_mapAddressBook locks
string GetAccountAddress(string strAccount, bool bForceNew=false)
{
string strAddress;
CRITICAL_BLOCK(cs_main)
CRITICAL_BLOCK(pwalletMain->cs_mapWallet)
+ CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
{
ret = GetAccountAddress(strAccount);
}
if (strAddress == GetAccountAddress(strOldAccount))
GetAccountAddress(strOldAccount, true);
}
+
+ pwalletMain->SetAddressBookName(strAddress, strAccount);
}
- pwalletMain->SetAddressBookName(strAddress, strAccount);
return Value::null;
}
string strAddress = PubKeyToAddress(pwalletMain->GetKeyFromKeyPool());
// Save
- pwalletMain->SetAddressBookName(strAddress, strName);
+ CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
+ pwalletMain->SetAddressBookName(strAddress, strName);
SetDefaultReceivingAddress(strAddress);
}
if (event.IsEditCancelled())
return;
string strAddress = (string)GetItemText(m_listCtrl, event.GetIndex(), 1);
- pwalletMain->SetAddressBookName(strAddress, string(event.GetText()));
+ CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
+ pwalletMain->SetAddressBookName(strAddress, string(event.GetText()));
pframeMain->RefreshListCtrl();
}
if (m_listCtrl->GetItemState(nIndex, wxLIST_STATE_SELECTED))
{
string strAddress = (string)GetItemText(m_listCtrl, nIndex, 1);
- CWalletDB(pwalletMain->strWalletFile).EraseName(strAddress);
+ CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
+ pwalletMain->DelAddressBookName(strAddress);
m_listCtrl->DeleteItem(nIndex);
}
}
}
// Write back
- if (strAddress != strAddressOrg)
- CWalletDB(pwalletMain->strWalletFile).EraseName(strAddressOrg);
- pwalletMain->SetAddressBookName(strAddress, strName);
+ CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
+ {
+ if (strAddress != strAddressOrg)
+ pwalletMain->DelAddressBookName(strAddressOrg);
+ pwalletMain->SetAddressBookName(strAddress, strName);
+ }
m_listCtrl->SetItem(nIndex, 1, strAddress);
m_listCtrl->SetItemText(nIndex, strName);
pframeMain->RefreshListCtrl();
}
// Add to list and select it
- pwalletMain->SetAddressBookName(strAddress, strName);
+ CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
+ pwalletMain->SetAddressBookName(strAddress, strName);
int nIndex = InsertLine(m_listCtrl, strName, strAddress);
SetSelection(m_listCtrl, nIndex);
m_listCtrl->SetFocus();
return true;
}
+
+bool CWallet::SetAddressBookName(const string& strAddress, const string& strName)
+{
+ mapAddressBook[strAddress] = strName;
+ if (!fFileBacked)
+ return false;
+ return CWalletDB(strWalletFile).WriteName(strAddress, strName);
+}
+
+bool CWallet::DelAddressBookName(const string& strAddress)
+{
+ mapAddressBook.erase(strAddress);
+ if (!fFileBacked)
+ return false;
+ return CWalletDB(strWalletFile).EraseName(strAddress);
+}
+
+
void CWallet::PrintWallet(const CBlock& block)
{
CRITICAL_BLOCK(cs_mapWallet)
bool LoadWallet(bool& fFirstRunRet);
// bool BackupWallet(const std::string& strDest);
- bool SetAddressBookName(const std::string& strAddress, const std::string& strName)
- {
- if (!fFileBacked)
- return false;
- return CWalletDB(strWalletFile).WriteName(strAddress, strName);
- }
+ // requires cs_mapAddressBook lock
+ bool SetAddressBookName(const std::string& strAddress, const std::string& strName);
+
+ // requires cs_mapAddressBook lock
+ bool DelAddressBookName(const std::string& strAddress);
void UpdatedTransaction(const uint256 &hashTx)
{