ethreact
- use ethreact.Event, - increased buffered event channels, - subscribe after loop reading from channel starts
This commit is contained in:
		
							parent
							
								
									94b12f7804
								
							
						
					
					
						commit
						75a7a4c97c
					
				| @ -4,6 +4,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"github.com/ethereum/eth-go/ethchain" | 	"github.com/ethereum/eth-go/ethchain" | ||||||
| 	"github.com/ethereum/eth-go/ethpub" | 	"github.com/ethereum/eth-go/ethpub" | ||||||
|  | 	"github.com/ethereum/eth-go/ethreact" | ||||||
| 	"github.com/ethereum/eth-go/ethutil" | 	"github.com/ethereum/eth-go/ethutil" | ||||||
| 	"github.com/go-qml/qml" | 	"github.com/go-qml/qml" | ||||||
| ) | ) | ||||||
| @ -24,8 +25,8 @@ type AppContainer interface { | |||||||
| type ExtApplication struct { | type ExtApplication struct { | ||||||
| 	*ethpub.PEthereum | 	*ethpub.PEthereum | ||||||
| 
 | 
 | ||||||
| 	blockChan       chan ethutil.React | 	blockChan       chan ethreact.Event | ||||||
| 	changeChan      chan ethutil.React | 	changeChan      chan ethreact.Event | ||||||
| 	quitChan        chan bool | 	quitChan        chan bool | ||||||
| 	watcherQuitChan chan bool | 	watcherQuitChan chan bool | ||||||
| 
 | 
 | ||||||
| @ -37,8 +38,8 @@ type ExtApplication struct { | |||||||
| func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { | func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { | ||||||
| 	app := &ExtApplication{ | 	app := &ExtApplication{ | ||||||
| 		ethpub.NewPEthereum(lib.eth), | 		ethpub.NewPEthereum(lib.eth), | ||||||
| 		make(chan ethutil.React, 1), | 		make(chan ethreact.Event, 10), | ||||||
| 		make(chan ethutil.React, 1), | 		make(chan ethreact.Event, 10), | ||||||
| 		make(chan bool), | 		make(chan bool), | ||||||
| 		make(chan bool), | 		make(chan bool), | ||||||
| 		container, | 		container, | ||||||
|  | |||||||
							
								
								
									
										123
									
								
								ethereal/gui.go
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								ethereal/gui.go
									
									
									
									
									
								
							| @ -8,6 +8,7 @@ import ( | |||||||
| 	"github.com/ethereum/eth-go/ethdb" | 	"github.com/ethereum/eth-go/ethdb" | ||||||
| 	"github.com/ethereum/eth-go/ethlog" | 	"github.com/ethereum/eth-go/ethlog" | ||||||
| 	"github.com/ethereum/eth-go/ethpub" | 	"github.com/ethereum/eth-go/ethpub" | ||||||
|  | 	"github.com/ethereum/eth-go/ethreact" | ||||||
| 	"github.com/ethereum/eth-go/ethutil" | 	"github.com/ethereum/eth-go/ethutil" | ||||||
| 	"github.com/ethereum/eth-go/ethwire" | 	"github.com/ethereum/eth-go/ethwire" | ||||||
| 	"github.com/ethereum/go-ethereum/utils" | 	"github.com/ethereum/go-ethereum/utils" | ||||||
| @ -143,7 +144,7 @@ func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) { | |||||||
| 	gui.readPreviousTransactions() | 	gui.readPreviousTransactions() | ||||||
| 	gui.setPeerInfo() | 	gui.setPeerInfo() | ||||||
| 
 | 
 | ||||||
| 	go gui.update() | 	gui.update() | ||||||
| 
 | 
 | ||||||
| 	return win, nil | 	return win, nil | ||||||
| } | } | ||||||
| @ -266,11 +267,67 @@ func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) { | |||||||
| func (gui *Gui) update() { | func (gui *Gui) update() { | ||||||
| 	reactor := gui.eth.Reactor() | 	reactor := gui.eth.Reactor() | ||||||
| 
 | 
 | ||||||
| 	blockChan := make(chan ethutil.React, 1) | 	blockChan := make(chan ethreact.Event, 1) | ||||||
| 	txChan := make(chan ethutil.React, 1) | 	txChan := make(chan ethreact.Event, 1) | ||||||
| 	objectChan := make(chan ethutil.React, 1) | 	objectChan := make(chan ethreact.Event, 1) | ||||||
| 	peerChan := make(chan ethutil.React, 1) | 	peerChan := make(chan ethreact.Event, 1) | ||||||
|  | 	ticker := time.NewTicker(5 * time.Second) | ||||||
| 
 | 
 | ||||||
|  | 	state := gui.eth.StateManager().TransState() | ||||||
|  | 
 | ||||||
|  | 	unconfirmedFunds := new(big.Int) | ||||||
|  | 	gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Amount))) | ||||||
|  | 
 | ||||||
|  | 	go func() { | ||||||
|  | 		for { | ||||||
|  | 			select { | ||||||
|  | 			case b := <-blockChan: | ||||||
|  | 				block := b.Resource.(*ethchain.Block) | ||||||
|  | 				gui.processBlock(block, false) | ||||||
|  | 				if bytes.Compare(block.Coinbase, gui.address()) == 0 { | ||||||
|  | 					gui.setWalletValue(gui.eth.StateManager().CurrentState().GetAccount(gui.address()).Amount, nil) | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 			case txMsg := <-txChan: | ||||||
|  | 				tx := txMsg.Resource.(*ethchain.Transaction) | ||||||
|  | 
 | ||||||
|  | 				if txMsg.Name == "newTx:pre" { | ||||||
|  | 					object := state.GetAccount(gui.address()) | ||||||
|  | 
 | ||||||
|  | 					if bytes.Compare(tx.Sender(), gui.address()) == 0 { | ||||||
|  | 						gui.win.Root().Call("addTx", ethpub.NewPTx(tx), "send") | ||||||
|  | 						gui.txDb.Put(tx.Hash(), tx.RlpEncode()) | ||||||
|  | 
 | ||||||
|  | 						unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) | ||||||
|  | 					} else if bytes.Compare(tx.Recipient, gui.address()) == 0 { | ||||||
|  | 						gui.win.Root().Call("addTx", ethpub.NewPTx(tx), "recv") | ||||||
|  | 						gui.txDb.Put(tx.Hash(), tx.RlpEncode()) | ||||||
|  | 
 | ||||||
|  | 						unconfirmedFunds.Add(unconfirmedFunds, tx.Value) | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					gui.setWalletValue(object.Amount, unconfirmedFunds) | ||||||
|  | 				} else { | ||||||
|  | 					object := state.GetAccount(gui.address()) | ||||||
|  | 					if bytes.Compare(tx.Sender(), gui.address()) == 0 { | ||||||
|  | 						object.SubAmount(tx.Value) | ||||||
|  | 					} else if bytes.Compare(tx.Recipient, gui.address()) == 0 { | ||||||
|  | 						object.AddAmount(tx.Value) | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					gui.setWalletValue(object.Amount, nil) | ||||||
|  | 
 | ||||||
|  | 					state.UpdateStateObject(object) | ||||||
|  | 				} | ||||||
|  | 			case <-objectChan: | ||||||
|  | 				gui.loadAddressBook() | ||||||
|  | 			case <-peerChan: | ||||||
|  | 				gui.setPeerInfo() | ||||||
|  | 			case <-ticker.C: | ||||||
|  | 				gui.setPeerInfo() | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
| 	reactor.Subscribe("newBlock", blockChan) | 	reactor.Subscribe("newBlock", blockChan) | ||||||
| 	reactor.Subscribe("newTx:pre", txChan) | 	reactor.Subscribe("newTx:pre", txChan) | ||||||
| 	reactor.Subscribe("newTx:post", txChan) | 	reactor.Subscribe("newTx:post", txChan) | ||||||
| @ -280,62 +337,6 @@ func (gui *Gui) update() { | |||||||
| 		reactor.Subscribe("object:"+string(nameReg.Address()), objectChan) | 		reactor.Subscribe("object:"+string(nameReg.Address()), objectChan) | ||||||
| 	} | 	} | ||||||
| 	reactor.Subscribe("peerList", peerChan) | 	reactor.Subscribe("peerList", peerChan) | ||||||
| 
 |  | ||||||
| 	ticker := time.NewTicker(5 * time.Second) |  | ||||||
| 
 |  | ||||||
| 	state := gui.eth.StateManager().TransState() |  | ||||||
| 
 |  | ||||||
| 	unconfirmedFunds := new(big.Int) |  | ||||||
| 	gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Amount))) |  | ||||||
| 
 |  | ||||||
| 	for { |  | ||||||
| 		select { |  | ||||||
| 		case b := <-blockChan: |  | ||||||
| 			block := b.Resource.(*ethchain.Block) |  | ||||||
| 			gui.processBlock(block, false) |  | ||||||
| 			if bytes.Compare(block.Coinbase, gui.address()) == 0 { |  | ||||||
| 				gui.setWalletValue(gui.eth.StateManager().CurrentState().GetAccount(gui.address()).Amount, nil) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 		case txMsg := <-txChan: |  | ||||||
| 			tx := txMsg.Resource.(*ethchain.Transaction) |  | ||||||
| 
 |  | ||||||
| 			if txMsg.Event == "newTx:pre" { |  | ||||||
| 				object := state.GetAccount(gui.address()) |  | ||||||
| 
 |  | ||||||
| 				if bytes.Compare(tx.Sender(), gui.address()) == 0 { |  | ||||||
| 					gui.win.Root().Call("addTx", ethpub.NewPTx(tx), "send") |  | ||||||
| 					gui.txDb.Put(tx.Hash(), tx.RlpEncode()) |  | ||||||
| 
 |  | ||||||
| 					unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) |  | ||||||
| 				} else if bytes.Compare(tx.Recipient, gui.address()) == 0 { |  | ||||||
| 					gui.win.Root().Call("addTx", ethpub.NewPTx(tx), "recv") |  | ||||||
| 					gui.txDb.Put(tx.Hash(), tx.RlpEncode()) |  | ||||||
| 
 |  | ||||||
| 					unconfirmedFunds.Add(unconfirmedFunds, tx.Value) |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				gui.setWalletValue(object.Amount, unconfirmedFunds) |  | ||||||
| 			} else { |  | ||||||
| 				object := state.GetAccount(gui.address()) |  | ||||||
| 				if bytes.Compare(tx.Sender(), gui.address()) == 0 { |  | ||||||
| 					object.SubAmount(tx.Value) |  | ||||||
| 				} else if bytes.Compare(tx.Recipient, gui.address()) == 0 { |  | ||||||
| 					object.AddAmount(tx.Value) |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				gui.setWalletValue(object.Amount, nil) |  | ||||||
| 
 |  | ||||||
| 				state.UpdateStateObject(object) |  | ||||||
| 			} |  | ||||||
| 		case <-objectChan: |  | ||||||
| 			gui.loadAddressBook() |  | ||||||
| 		case <-peerChan: |  | ||||||
| 			gui.setPeerInfo() |  | ||||||
| 		case <-ticker.C: |  | ||||||
| 			gui.setPeerInfo() |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (gui *Gui) setPeerInfo() { | func (gui *Gui) setPeerInfo() { | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ import ( | |||||||
| 	"github.com/ethereum/eth-go/ethchain" | 	"github.com/ethereum/eth-go/ethchain" | ||||||
| 	"github.com/ethereum/eth-go/ethlog" | 	"github.com/ethereum/eth-go/ethlog" | ||||||
| 	"github.com/ethereum/eth-go/ethpub" | 	"github.com/ethereum/eth-go/ethpub" | ||||||
|  | 	"github.com/ethereum/eth-go/ethreact" | ||||||
| 	"github.com/ethereum/eth-go/ethutil" | 	"github.com/ethereum/eth-go/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/utils" | 	"github.com/ethereum/go-ethereum/utils" | ||||||
| 	"github.com/obscuren/otto" | 	"github.com/obscuren/otto" | ||||||
| @ -22,8 +23,8 @@ type JSRE struct { | |||||||
| 	vm       *otto.Otto | 	vm       *otto.Otto | ||||||
| 	lib      *ethpub.PEthereum | 	lib      *ethpub.PEthereum | ||||||
| 
 | 
 | ||||||
| 	blockChan  chan ethutil.React | 	blockChan  chan ethreact.Event | ||||||
| 	changeChan chan ethutil.React | 	changeChan chan ethreact.Event | ||||||
| 	quitChan   chan bool | 	quitChan   chan bool | ||||||
| 
 | 
 | ||||||
| 	objectCb map[string][]otto.Value | 	objectCb map[string][]otto.Value | ||||||
| @ -48,8 +49,8 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE { | |||||||
| 		ethereum, | 		ethereum, | ||||||
| 		otto.New(), | 		otto.New(), | ||||||
| 		ethpub.NewPEthereum(ethereum), | 		ethpub.NewPEthereum(ethereum), | ||||||
| 		make(chan ethutil.React, 1), | 		make(chan ethreact.Event, 10), | ||||||
| 		make(chan ethutil.React, 1), | 		make(chan ethreact.Event, 10), | ||||||
| 		make(chan bool), | 		make(chan bool), | ||||||
| 		make(map[string][]otto.Value), | 		make(map[string][]otto.Value), | ||||||
| 	} | 	} | ||||||
| @ -64,6 +65,10 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE { | |||||||
| 	// We have to make sure that, whoever calls this, calls "Stop"
 | 	// We have to make sure that, whoever calls this, calls "Stop"
 | ||||||
| 	go re.mainLoop() | 	go re.mainLoop() | ||||||
| 
 | 
 | ||||||
|  | 	// Subscribe to events
 | ||||||
|  | 	reactor := ethereum.Reactor() | ||||||
|  | 	reactor.Subscribe("newBlock", self.blockChan) | ||||||
|  | 
 | ||||||
| 	re.Bind("eth", &JSEthereum{re.lib, re.vm}) | 	re.Bind("eth", &JSEthereum{re.lib, re.vm}) | ||||||
| 
 | 
 | ||||||
| 	re.initStdFuncs() | 	re.initStdFuncs() | ||||||
| @ -108,10 +113,6 @@ func (self *JSRE) Stop() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (self *JSRE) mainLoop() { | func (self *JSRE) mainLoop() { | ||||||
| 	// Subscribe to events
 |  | ||||||
| 	reactor := self.ethereum.Reactor() |  | ||||||
| 	reactor.Subscribe("newBlock", self.blockChan) |  | ||||||
| 
 |  | ||||||
| out: | out: | ||||||
| 	for { | 	for { | ||||||
| 		select { | 		select { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user