/
event_registry.go
74 lines (57 loc) · 1.37 KB
/
event_registry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package vlc
// #cgo LDFLAGS: -lvlc
// #include <vlc/vlc.h>
import "C"
import "sync"
// EventID uniquely identifies a registered event.
type EventID uint64
// EventCallback represents an event notification callback function.
type EventCallback func(Event, interface{})
type internalEventCallback func(*C.libvlc_event_t, interface{})
type eventContext struct {
event Event
externalCallback EventCallback
internalCallback internalEventCallback
userData interface{}
}
type eventRegistry struct {
sync.RWMutex
contexts map[EventID]*eventContext
sequence EventID
}
func newEventRegistry() *eventRegistry {
return &eventRegistry{
contexts: map[EventID]*eventContext{},
}
}
func (er *eventRegistry) get(id EventID) (*eventContext, bool) {
if id == 0 {
return nil, false
}
er.RLock()
ctx, ok := er.contexts[id]
er.RUnlock()
return ctx, ok
}
func (er *eventRegistry) add(event Event, externalCallback EventCallback,
internalCallback internalEventCallback, userData interface{}) EventID {
er.Lock()
er.sequence++
id := er.sequence
er.contexts[id] = &eventContext{
event: event,
externalCallback: externalCallback,
internalCallback: internalCallback,
userData: userData,
}
er.Unlock()
return id
}
func (er *eventRegistry) remove(id EventID) {
if id == 0 {
return
}
er.Lock()
delete(er.contexts, id)
er.Unlock()
}