From 2a5af8fac72846a7354dd79143727bac4ee89cb9 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 17 Nov 2014 10:40:40 -0600 Subject: enable `go vet` --- event/profile.tmp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 event/profile.tmp (limited to 'event') diff --git a/event/profile.tmp b/event/profile.tmp new file mode 100644 index 000000000..c6496902d --- /dev/null +++ b/event/profile.tmp @@ -0,0 +1,40 @@ +mode: count +github.com/ethereum/go-ethereum/event/event.go:41.66,45.17 4 1005 +github.com/ethereum/go-ethereum/event/event.go:63.2,63.12 1 1004 +github.com/ethereum/go-ethereum/event/event.go:45.17,47.3 1 1 +github.com/ethereum/go-ethereum/event/event.go:47.3,48.22 1 1004 +github.com/ethereum/go-ethereum/event/event.go:51.3,51.27 1 1004 +github.com/ethereum/go-ethereum/event/event.go:48.22,50.4 1 5 +github.com/ethereum/go-ethereum/event/event.go:51.27,54.32 3 1006 +github.com/ethereum/go-ethereum/event/event.go:57.4,60.25 4 1005 +github.com/ethereum/go-ethereum/event/event.go:54.32,56.5 1 1 +github.com/ethereum/go-ethereum/event/event.go:68.48,71.17 3 3513 +github.com/ethereum/go-ethereum/event/event.go:75.2,77.27 3 3511 +github.com/ethereum/go-ethereum/event/event.go:80.2,80.12 1 3509 +github.com/ethereum/go-ethereum/event/event.go:71.17,74.3 2 2 +github.com/ethereum/go-ethereum/event/event.go:77.27,79.3 1 2576 +github.com/ethereum/go-ethereum/event/event.go:86.28,88.32 2 5 +github.com/ethereum/go-ethereum/event/event.go:93.2,95.20 3 5 +github.com/ethereum/go-ethereum/event/event.go:88.32,89.28 1 3 +github.com/ethereum/go-ethereum/event/event.go:89.28,91.4 1 3 +github.com/ethereum/go-ethereum/event/event.go:98.36,100.34 2 1001 +github.com/ethereum/go-ethereum/event/event.go:109.2,109.22 1 1001 +github.com/ethereum/go-ethereum/event/event.go:100.34,101.37 1 1001 +github.com/ethereum/go-ethereum/event/event.go:101.37,102.22 1 1001 +github.com/ethereum/go-ethereum/event/event.go:102.22,104.5 1 2 +github.com/ethereum/go-ethereum/event/event.go:104.5,106.5 1 999 +github.com/ethereum/go-ethereum/event/event.go:112.46,113.26 1 2007 +github.com/ethereum/go-ethereum/event/event.go:118.2,118.11 1 1005 +github.com/ethereum/go-ethereum/event/event.go:113.26,114.16 1 181499 +github.com/ethereum/go-ethereum/event/event.go:114.16,116.4 1 1002 +github.com/ethereum/go-ethereum/event/event.go:121.52,126.2 4 999 +github.com/ethereum/go-ethereum/event/event.go:142.35,150.2 2 1005 +github.com/ethereum/go-ethereum/event/event.go:152.44,154.2 1 1003 +github.com/ethereum/go-ethereum/event/event.go:156.32,159.2 2 1001 +github.com/ethereum/go-ethereum/event/event.go:161.30,164.14 3 1004 +github.com/ethereum/go-ethereum/event/event.go:167.2,173.19 6 1003 +github.com/ethereum/go-ethereum/event/event.go:164.14,166.3 1 1 +github.com/ethereum/go-ethereum/event/event.go:176.42,178.9 2 2575 +github.com/ethereum/go-ethereum/event/event.go:182.2,182.20 1 2575 +github.com/ethereum/go-ethereum/event/event.go:179.2,179.21 0 1004 +github.com/ethereum/go-ethereum/event/event.go:180.2,180.19 0 1571 -- cgit v1.2.3 From 14e2e488fdf0f4d6ed1a5a48ffbbe883faa7edb6 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 19 Nov 2014 12:25:52 +0100 Subject: Added `chain` tests & minor fixes * Fork tests (equal and larger chains) * `chain.link` fields are now exported * moved debug function from state to dump.go --- event/profile.tmp | 40 ---------------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 event/profile.tmp (limited to 'event') diff --git a/event/profile.tmp b/event/profile.tmp deleted file mode 100644 index c6496902d..000000000 --- a/event/profile.tmp +++ /dev/null @@ -1,40 +0,0 @@ -mode: count -github.com/ethereum/go-ethereum/event/event.go:41.66,45.17 4 1005 -github.com/ethereum/go-ethereum/event/event.go:63.2,63.12 1 1004 -github.com/ethereum/go-ethereum/event/event.go:45.17,47.3 1 1 -github.com/ethereum/go-ethereum/event/event.go:47.3,48.22 1 1004 -github.com/ethereum/go-ethereum/event/event.go:51.3,51.27 1 1004 -github.com/ethereum/go-ethereum/event/event.go:48.22,50.4 1 5 -github.com/ethereum/go-ethereum/event/event.go:51.27,54.32 3 1006 -github.com/ethereum/go-ethereum/event/event.go:57.4,60.25 4 1005 -github.com/ethereum/go-ethereum/event/event.go:54.32,56.5 1 1 -github.com/ethereum/go-ethereum/event/event.go:68.48,71.17 3 3513 -github.com/ethereum/go-ethereum/event/event.go:75.2,77.27 3 3511 -github.com/ethereum/go-ethereum/event/event.go:80.2,80.12 1 3509 -github.com/ethereum/go-ethereum/event/event.go:71.17,74.3 2 2 -github.com/ethereum/go-ethereum/event/event.go:77.27,79.3 1 2576 -github.com/ethereum/go-ethereum/event/event.go:86.28,88.32 2 5 -github.com/ethereum/go-ethereum/event/event.go:93.2,95.20 3 5 -github.com/ethereum/go-ethereum/event/event.go:88.32,89.28 1 3 -github.com/ethereum/go-ethereum/event/event.go:89.28,91.4 1 3 -github.com/ethereum/go-ethereum/event/event.go:98.36,100.34 2 1001 -github.com/ethereum/go-ethereum/event/event.go:109.2,109.22 1 1001 -github.com/ethereum/go-ethereum/event/event.go:100.34,101.37 1 1001 -github.com/ethereum/go-ethereum/event/event.go:101.37,102.22 1 1001 -github.com/ethereum/go-ethereum/event/event.go:102.22,104.5 1 2 -github.com/ethereum/go-ethereum/event/event.go:104.5,106.5 1 999 -github.com/ethereum/go-ethereum/event/event.go:112.46,113.26 1 2007 -github.com/ethereum/go-ethereum/event/event.go:118.2,118.11 1 1005 -github.com/ethereum/go-ethereum/event/event.go:113.26,114.16 1 181499 -github.com/ethereum/go-ethereum/event/event.go:114.16,116.4 1 1002 -github.com/ethereum/go-ethereum/event/event.go:121.52,126.2 4 999 -github.com/ethereum/go-ethereum/event/event.go:142.35,150.2 2 1005 -github.com/ethereum/go-ethereum/event/event.go:152.44,154.2 1 1003 -github.com/ethereum/go-ethereum/event/event.go:156.32,159.2 2 1001 -github.com/ethereum/go-ethereum/event/event.go:161.30,164.14 3 1004 -github.com/ethereum/go-ethereum/event/event.go:167.2,173.19 6 1003 -github.com/ethereum/go-ethereum/event/event.go:164.14,166.3 1 1 -github.com/ethereum/go-ethereum/event/event.go:176.42,178.9 2 2575 -github.com/ethereum/go-ethereum/event/event.go:182.2,182.20 1 2575 -github.com/ethereum/go-ethereum/event/event.go:179.2,179.21 0 1004 -github.com/ethereum/go-ethereum/event/event.go:180.2,180.19 0 1571 -- cgit v1.2.3 From ed1538248f2e7a44680d22a052a234a31b736624 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 12 Dec 2014 22:19:39 +0100 Subject: Moved filter to events --- event/filter/filter.go | 70 ++++++++++++++++++++++++++++++++++++++++++ event/filter/filter_test.go | 34 ++++++++++++++++++++ event/filter/generic_filter.go | 22 +++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 event/filter/filter.go create mode 100644 event/filter/filter_test.go create mode 100644 event/filter/generic_filter.go (limited to 'event') diff --git a/event/filter/filter.go b/event/filter/filter.go new file mode 100644 index 000000000..9817d5782 --- /dev/null +++ b/event/filter/filter.go @@ -0,0 +1,70 @@ +package filter + +import "reflect" + +type Filter interface { + Compare(Filter) bool + Trigger(data interface{}) +} + +type FilterEvent struct { + filter Filter + data interface{} +} + +type Filters struct { + id int + watchers map[int]Filter + ch chan FilterEvent + + quit chan struct{} +} + +func New() *Filters { + return &Filters{ + ch: make(chan FilterEvent), + watchers: make(map[int]Filter), + quit: make(chan struct{}), + } +} + +func (self *Filters) Start() { + go self.loop() +} + +func (self *Filters) Stop() { + close(self.quit) +} + +func (self *Filters) Notify(filter Filter, data interface{}) { + self.ch <- FilterEvent{filter, data} +} + +func (self *Filters) Install(watcher Filter) int { + self.watchers[self.id] = watcher + self.id++ + + return self.id - 1 +} + +func (self *Filters) Uninstall(id int) { + delete(self.watchers, id) +} + +func (self *Filters) loop() { +out: + for { + select { + case <-self.quit: + break out + case event := <-self.ch: + for _, watcher := range self.watchers { + if reflect.TypeOf(watcher) == reflect.TypeOf(event.filter) { + if watcher.Compare(event.filter) { + watcher.Trigger(event.data) + } + } + } + } + } +} diff --git a/event/filter/filter_test.go b/event/filter/filter_test.go new file mode 100644 index 000000000..815deb63a --- /dev/null +++ b/event/filter/filter_test.go @@ -0,0 +1,34 @@ +package filter + +import "testing" + +func TestFilters(t *testing.T) { + var success bool + var failure bool + + fm := New() + fm.Start() + fm.Install(Generic{ + Str1: "hello", + Fn: func(data interface{}) { + success = data.(bool) + }, + }) + fm.Install(Generic{ + Str1: "hello1", + Str2: "hello", + Fn: func(data interface{}) { + failure = true + }, + }) + fm.Notify(Generic{Str1: "hello"}, true) + fm.Stop() + + if !success { + t.Error("expected 'hello' to be posted") + } + + if failure { + t.Error("hello1 was triggered") + } +} diff --git a/event/filter/generic_filter.go b/event/filter/generic_filter.go new file mode 100644 index 000000000..b04b4801e --- /dev/null +++ b/event/filter/generic_filter.go @@ -0,0 +1,22 @@ +package filter + +type Generic struct { + Str1, Str2, Str3 string + + Fn func(data interface{}) +} + +func (self Generic) Compare(f Filter) bool { + filter := f.(Generic) + if (len(self.Str1) == 0 || filter.Str1 == self.Str1) && + (len(self.Str2) == 0 || filter.Str2 == self.Str2) && + (len(self.Str3) == 0 || filter.Str3 == self.Str3) { + return true + } + + return false +} + +func (self Generic) Trigger(data interface{}) { + self.Fn(data) +} -- cgit v1.2.3 From cdb2ebbdfa510294b8443e33c32f9e0ec414f78e Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 15 Dec 2014 12:08:10 +0100 Subject: Added old filter. Needs some refactoring --- event/filter/old_filter.go | 94 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 event/filter/old_filter.go (limited to 'event') diff --git a/event/filter/old_filter.go b/event/filter/old_filter.go new file mode 100644 index 000000000..1a9a88173 --- /dev/null +++ b/event/filter/old_filter.go @@ -0,0 +1,94 @@ +// XXX This is the old filter system specifically for messages. This is till in used and could use some refactoring +package filter + +import ( + "sync" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/state" +) + +type FilterManager struct { + eventMux *event.TypeMux + + filterMu sync.RWMutex + filterId int + filters map[int]*core.Filter + + quit chan struct{} +} + +func NewFilterManager(mux *event.TypeMux) *FilterManager { + return &FilterManager{ + eventMux: mux, + filters: make(map[int]*core.Filter), + } +} + +func (self *FilterManager) Start() { + go self.filterLoop() +} + +func (self *FilterManager) Stop() { + close(self.quit) +} + +func (self *FilterManager) InstallFilter(filter *core.Filter) (id int) { + self.filterMu.Lock() + id = self.filterId + self.filters[id] = filter + self.filterId++ + self.filterMu.Unlock() + return id +} + +func (self *FilterManager) UninstallFilter(id int) { + self.filterMu.Lock() + delete(self.filters, id) + self.filterMu.Unlock() +} + +// GetFilter retrieves a filter installed using InstallFilter. +// The filter may not be modified. +func (self *FilterManager) GetFilter(id int) *core.Filter { + self.filterMu.RLock() + defer self.filterMu.RUnlock() + return self.filters[id] +} + +func (self *FilterManager) filterLoop() { + // Subscribe to events + events := self.eventMux.Subscribe(core.NewBlockEvent{}, state.Messages(nil)) + +out: + for { + select { + case <-self.quit: + break out + case event := <-events.Chan(): + switch event := event.(type) { + case core.NewBlockEvent: + self.filterMu.RLock() + for _, filter := range self.filters { + if filter.BlockCallback != nil { + filter.BlockCallback(event.Block) + } + } + self.filterMu.RUnlock() + + case state.Messages: + self.filterMu.RLock() + for _, filter := range self.filters { + if filter.MessageCallback != nil { + msgs := filter.FilterMessages(event) + if len(msgs) > 0 { + filter.MessageCallback(msgs) + } + } + } + self.filterMu.RUnlock() + } + } + } +} -- cgit v1.2.3 From 52b54631a47dfa46742635be178f2f8d33dd9f41 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 16 Dec 2014 19:55:57 +0100 Subject: Whisper watches fixes --- event/filter/generic_filter.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'event') diff --git a/event/filter/generic_filter.go b/event/filter/generic_filter.go index b04b4801e..2ce0f0642 100644 --- a/event/filter/generic_filter.go +++ b/event/filter/generic_filter.go @@ -2,19 +2,29 @@ package filter type Generic struct { Str1, Str2, Str3 string + Data map[string]struct{} Fn func(data interface{}) } +// self = registered, f = incoming func (self Generic) Compare(f Filter) bool { + var strMatch, dataMatch = true, true + filter := f.(Generic) - if (len(self.Str1) == 0 || filter.Str1 == self.Str1) && - (len(self.Str2) == 0 || filter.Str2 == self.Str2) && - (len(self.Str3) == 0 || filter.Str3 == self.Str3) { - return true + if (len(self.Str1) > 0 && filter.Str1 != self.Str1) || + (len(self.Str2) > 0 && filter.Str2 != self.Str2) || + (len(self.Str3) > 0 && filter.Str3 != self.Str3) { + strMatch = false + } + + for k, _ := range self.Data { + if _, ok := filter.Data[k]; !ok { + return false + } } - return false + return strMatch && dataMatch } func (self Generic) Trigger(data interface{}) { -- cgit v1.2.3 From e3da85faedf21a3ddb73a0fa29decf65364e6c39 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 10 Jan 2015 00:51:56 +0100 Subject: Implemented filter for ws + fixes * proper 0xhex * filters fixed * start of filter manager * accounts for ws. Closes #246 --- event/filter/old_filter.go | 2 ++ 1 file changed, 2 insertions(+) (limited to 'event') diff --git a/event/filter/old_filter.go b/event/filter/old_filter.go index 1a9a88173..6c7f053d4 100644 --- a/event/filter/old_filter.go +++ b/event/filter/old_filter.go @@ -2,6 +2,7 @@ package filter import ( + "fmt" "sync" "github.com/ethereum/go-ethereum/core" @@ -78,6 +79,7 @@ out: self.filterMu.RUnlock() case state.Messages: + fmt.Println("got messages") self.filterMu.RLock() for _, filter := range self.filters { if filter.MessageCallback != nil { -- cgit v1.2.3 From 35fe4313d57e1df6c3c8af0bc0b530bd7033e21b Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 12 Jan 2015 10:19:27 +0100 Subject: pre-pow --- event/filter/old_filter.go | 2 -- 1 file changed, 2 deletions(-) (limited to 'event') diff --git a/event/filter/old_filter.go b/event/filter/old_filter.go index 6c7f053d4..1a9a88173 100644 --- a/event/filter/old_filter.go +++ b/event/filter/old_filter.go @@ -2,7 +2,6 @@ package filter import ( - "fmt" "sync" "github.com/ethereum/go-ethereum/core" @@ -79,7 +78,6 @@ out: self.filterMu.RUnlock() case state.Messages: - fmt.Println("got messages") self.filterMu.RLock() for _, filter := range self.filters { if filter.MessageCallback != nil { -- cgit v1.2.3 From 34689cb3f369ad71164b81d0c05238d78cb67945 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 12 Jan 2015 20:36:45 +0100 Subject: Added manual triggering of filters --- event/filter/filter.go | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'event') diff --git a/event/filter/filter.go b/event/filter/filter.go index 9817d5782..ca767f413 100644 --- a/event/filter/filter.go +++ b/event/filter/filter.go @@ -68,3 +68,11 @@ out: } } } + +func (self *Filters) Match(a, b Filter) bool { + return reflect.TypeOf(a) == reflect.TypeOf(b) && a.Compare(b) +} + +func (self *Filters) Get(i int) Filter { + return self.watchers[i] +} -- cgit v1.2.3 From f3e78c8f3cd2196ef70a41f298b6df556543d581 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 28 Jan 2015 10:23:18 +0100 Subject: reworking messages => log --- event/filter/old_filter.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'event') diff --git a/event/filter/old_filter.go b/event/filter/old_filter.go index 1a9a88173..c30a7e584 100644 --- a/event/filter/old_filter.go +++ b/event/filter/old_filter.go @@ -77,13 +77,13 @@ out: } self.filterMu.RUnlock() - case state.Messages: + case state.Logs: self.filterMu.RLock() for _, filter := range self.filters { - if filter.MessageCallback != nil { - msgs := filter.FilterMessages(event) + if filter.LogsCallback != nil { + msgs := filter.FilterLogs(event) if len(msgs) > 0 { - filter.MessageCallback(msgs) + filter.LogsCallback(msgs) } } } -- cgit v1.2.3