diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-03-23 23:04:39 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2017-03-23 23:04:39 +0800 |
commit | 8ff7e55ab547e6c915a74971126f64b7582f2b77 (patch) | |
tree | 7db22dd944c1f1197cbbda1c4e16b54818d3c4db /accounts | |
parent | 26da6daaa96a6d45187e5a2ff519676e9e772cb2 (diff) | |
download | go-tangerine-8ff7e55ab547e6c915a74971126f64b7582f2b77.tar go-tangerine-8ff7e55ab547e6c915a74971126f64b7582f2b77.tar.gz go-tangerine-8ff7e55ab547e6c915a74971126f64b7582f2b77.tar.bz2 go-tangerine-8ff7e55ab547e6c915a74971126f64b7582f2b77.tar.lz go-tangerine-8ff7e55ab547e6c915a74971126f64b7582f2b77.tar.xz go-tangerine-8ff7e55ab547e6c915a74971126f64b7582f2b77.tar.zst go-tangerine-8ff7e55ab547e6c915a74971126f64b7582f2b77.zip |
accounts/usbwallet: if a confirmation is pending, skip refresh
Diffstat (limited to 'accounts')
-rw-r--r-- | accounts/usbwallet/ledger_hub.go | 9 | ||||
-rw-r--r-- | accounts/usbwallet/ledger_wallet.go | 10 |
2 files changed, 16 insertions, 3 deletions
diff --git a/accounts/usbwallet/ledger_hub.go b/accounts/usbwallet/ledger_hub.go index ed992a82d..fcbc24c0f 100644 --- a/accounts/usbwallet/ledger_hub.go +++ b/accounts/usbwallet/ledger_hub.go @@ -58,7 +58,10 @@ type LedgerHub struct { quit chan chan error stateLock sync.RWMutex // Protects the internals of the hub from racey access - commsLock sync.RWMutex // Allows wallets to lock enumeration (TODO(karalabe): remove if hotplug lands on Windows) + + // TODO(karalabe): remove if hotplug lands on Windows + commsPend int // Number of operations blocking enumeration + commsLock sync.Mutex // Lock protecting the pending counter and enumeration } // NewLedgerHub creates a new hardware wallet manager for Ledger devices. @@ -109,6 +112,10 @@ func (hub *LedgerHub) refreshWallets() { // be to ditch enumeration in favor of hutplug events, but that don't work yet // on Windows so if we need to hack it anyway, this is more elegant for now. hub.commsLock.Lock() + if hub.commsPend > 0 { // A confirmation is pending, don't refresh + hub.commsLock.Unlock() + return + } } for _, info := range hid.Enumerate(0, 0) { // Can't enumerate directly, one valid ID is the 0 wildcard for _, id := range ledgerDeviceIDs { diff --git a/accounts/usbwallet/ledger_wallet.go b/accounts/usbwallet/ledger_wallet.go index 97434ed3b..f1beebb2c 100644 --- a/accounts/usbwallet/ledger_wallet.go +++ b/accounts/usbwallet/ledger_wallet.go @@ -579,9 +579,15 @@ func (w *ledgerWallet) SignTx(account accounts.Account, tx *types.Transaction, c // Ensure the device isn't screwed with while user confirmation is pending // TODO(karalabe): remove if hotplug lands on Windows - w.hub.commsLock.RLock() - defer w.hub.commsLock.RUnlock() + w.hub.commsLock.Lock() + w.hub.commsPend++ + w.hub.commsLock.Unlock() + defer func() { + w.hub.commsLock.Lock() + w.hub.commsPend-- + w.hub.commsLock.Unlock() + }() return w.ledgerSign(path, account.Address, tx, chainID) } |