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" | ||||
| 	"github.com/ethereum/eth-go/ethchain" | ||||
| 	"github.com/ethereum/eth-go/ethpub" | ||||
| 	"github.com/ethereum/eth-go/ethreact" | ||||
| 	"github.com/ethereum/eth-go/ethutil" | ||||
| 	"github.com/go-qml/qml" | ||||
| ) | ||||
| @ -24,8 +25,8 @@ type AppContainer interface { | ||||
| type ExtApplication struct { | ||||
| 	*ethpub.PEthereum | ||||
| 
 | ||||
| 	blockChan       chan ethutil.React | ||||
| 	changeChan      chan ethutil.React | ||||
| 	blockChan       chan ethreact.Event | ||||
| 	changeChan      chan ethreact.Event | ||||
| 	quitChan        chan bool | ||||
| 	watcherQuitChan chan bool | ||||
| 
 | ||||
| @ -37,8 +38,8 @@ type ExtApplication struct { | ||||
| func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { | ||||
| 	app := &ExtApplication{ | ||||
| 		ethpub.NewPEthereum(lib.eth), | ||||
| 		make(chan ethutil.React, 1), | ||||
| 		make(chan ethutil.React, 1), | ||||
| 		make(chan ethreact.Event, 10), | ||||
| 		make(chan ethreact.Event, 10), | ||||
| 		make(chan bool), | ||||
| 		make(chan bool), | ||||
| 		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/ethlog" | ||||
| 	"github.com/ethereum/eth-go/ethpub" | ||||
| 	"github.com/ethereum/eth-go/ethreact" | ||||
| 	"github.com/ethereum/eth-go/ethutil" | ||||
| 	"github.com/ethereum/eth-go/ethwire" | ||||
| 	"github.com/ethereum/go-ethereum/utils" | ||||
| @ -143,7 +144,7 @@ func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) { | ||||
| 	gui.readPreviousTransactions() | ||||
| 	gui.setPeerInfo() | ||||
| 
 | ||||
| 	go gui.update() | ||||
| 	gui.update() | ||||
| 
 | ||||
| 	return win, nil | ||||
| } | ||||
| @ -266,11 +267,67 @@ func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) { | ||||
| func (gui *Gui) update() { | ||||
| 	reactor := gui.eth.Reactor() | ||||
| 
 | ||||
| 	blockChan := make(chan ethutil.React, 1) | ||||
| 	txChan := make(chan ethutil.React, 1) | ||||
| 	objectChan := make(chan ethutil.React, 1) | ||||
| 	peerChan := make(chan ethutil.React, 1) | ||||
| 	blockChan := make(chan ethreact.Event, 1) | ||||
| 	txChan := make(chan ethreact.Event, 1) | ||||
| 	objectChan := make(chan ethreact.Event, 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("newTx:pre", txChan) | ||||
| 	reactor.Subscribe("newTx:post", txChan) | ||||
| @ -280,62 +337,6 @@ func (gui *Gui) update() { | ||||
| 		reactor.Subscribe("object:"+string(nameReg.Address()), objectChan) | ||||
| 	} | ||||
| 	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() { | ||||
|  | ||||
| @ -6,6 +6,7 @@ import ( | ||||
| 	"github.com/ethereum/eth-go/ethchain" | ||||
| 	"github.com/ethereum/eth-go/ethlog" | ||||
| 	"github.com/ethereum/eth-go/ethpub" | ||||
| 	"github.com/ethereum/eth-go/ethreact" | ||||
| 	"github.com/ethereum/eth-go/ethutil" | ||||
| 	"github.com/ethereum/go-ethereum/utils" | ||||
| 	"github.com/obscuren/otto" | ||||
| @ -22,8 +23,8 @@ type JSRE struct { | ||||
| 	vm       *otto.Otto | ||||
| 	lib      *ethpub.PEthereum | ||||
| 
 | ||||
| 	blockChan  chan ethutil.React | ||||
| 	changeChan chan ethutil.React | ||||
| 	blockChan  chan ethreact.Event | ||||
| 	changeChan chan ethreact.Event | ||||
| 	quitChan   chan bool | ||||
| 
 | ||||
| 	objectCb map[string][]otto.Value | ||||
| @ -48,8 +49,8 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE { | ||||
| 		ethereum, | ||||
| 		otto.New(), | ||||
| 		ethpub.NewPEthereum(ethereum), | ||||
| 		make(chan ethutil.React, 1), | ||||
| 		make(chan ethutil.React, 1), | ||||
| 		make(chan ethreact.Event, 10), | ||||
| 		make(chan ethreact.Event, 10), | ||||
| 		make(chan bool), | ||||
| 		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"
 | ||||
| 	go re.mainLoop() | ||||
| 
 | ||||
| 	// Subscribe to events
 | ||||
| 	reactor := ethereum.Reactor() | ||||
| 	reactor.Subscribe("newBlock", self.blockChan) | ||||
| 
 | ||||
| 	re.Bind("eth", &JSEthereum{re.lib, re.vm}) | ||||
| 
 | ||||
| 	re.initStdFuncs() | ||||
| @ -108,10 +113,6 @@ func (self *JSRE) Stop() { | ||||
| } | ||||
| 
 | ||||
| func (self *JSRE) mainLoop() { | ||||
| 	// Subscribe to events
 | ||||
| 	reactor := self.ethereum.Reactor() | ||||
| 	reactor.Subscribe("newBlock", self.blockChan) | ||||
| 
 | ||||
| out: | ||||
| 	for { | ||||
| 		select { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user