aboutsummaryrefslogtreecommitdiffstats
path: root/accounts
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2017-03-23 23:04:39 +0800
committerPéter Szilágyi <peterke@gmail.com>2017-03-23 23:04:39 +0800
commit8ff7e55ab547e6c915a74971126f64b7582f2b77 (patch)
tree7db22dd944c1f1197cbbda1c4e16b54818d3c4db /accounts
parent26da6daaa96a6d45187e5a2ff519676e9e772cb2 (diff)
downloadgo-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.go9
-rw-r--r--accounts/usbwallet/ledger_wallet.go10
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)
}