@@ -6,111 +6,107 @@ import (
6
6
"time"
7
7
)
8
8
9
- type Client interface {
10
- Write (data []byte ) error
11
- }
12
-
13
- type pingConfig struct {
9
+ type wpConfig struct {
14
10
interval time.Duration
15
- dataFunc func () [] byte
11
+ callback func () error
16
12
}
17
13
18
- type PingManager struct {
19
- clients map [int64 ]map [Client ] pingConfig
20
- clientPingMap map [Client ]int64
21
- mutex sync.Mutex
14
+ type WorkerPool struct {
15
+ workers map [int64 ]map [int64 ] wpConfig
16
+ workersByIntervals map [int64 ]int64
17
+ mutex sync.Mutex
22
18
}
23
19
24
- // NewPingManager creates a new PingManager instance.
25
- func NewPingManager () * PingManager {
26
- return & PingManager {
27
- clients : make (map [int64 ]map [Client ] pingConfig ),
28
- clientPingMap : make (map [Client ]int64 ),
20
+ // NewWorkerPool creates a new WorkerPool instance.
21
+ func NewWorkerPool () * WorkerPool {
22
+ return & WorkerPool {
23
+ workers : make (map [int64 ]map [int64 ] wpConfig ),
24
+ workersByIntervals : make (map [int64 ]int64 ),
29
25
}
30
26
}
31
27
32
- // Add registers a client to be pinged .
33
- func (m * PingManager ) Add (client Client , pingInterval time.Duration , dataFunc func () [] byte ) {
34
- // Calculate the next ping time in seconds
35
- timeToPing := time .Now ().Add (pingInterval ).Unix ()
28
+ // Add registers a new worker .
29
+ func (m * WorkerPool ) Add (id int64 , interval time.Duration , callback func () error ) {
30
+ // Calculate the next worker time in seconds
31
+ timeToWork := time .Now ().Add (interval ).Unix ()
36
32
37
33
m .mutex .Lock ()
38
34
defer m .mutex .Unlock ()
39
- if m .clients [ timeToPing ] == nil {
40
- m .clients [ timeToPing ] = make (map [Client ] pingConfig )
35
+ if m .workers [ timeToWork ] == nil {
36
+ m .workers [ timeToWork ] = make (map [int64 ] wpConfig )
41
37
}
42
38
43
- m.clients [ timeToPing ][ client ] = pingConfig {
44
- interval : pingInterval ,
45
- dataFunc : dataFunc ,
39
+ m.workers [ timeToWork ][ id ] = wpConfig {
40
+ interval : interval ,
41
+ callback : callback ,
46
42
}
47
- m .clientPingMap [ client ] = timeToPing
43
+ m .workersByIntervals [ id ] = timeToWork
48
44
}
49
45
50
- // Remove unregisters a client .
51
- func (m * PingManager ) Remove (client Client ) {
46
+ // Remove unregisters a worker .
47
+ func (m * WorkerPool ) Remove (id int64 ) {
52
48
m .mutex .Lock ()
53
49
defer m .mutex .Unlock ()
54
50
55
- nextPingTime , ok := m .clientPingMap [ client ]
51
+ nexTime , ok := m .workersByIntervals [ id ]
56
52
if ok {
57
- delete (m .clients [ nextPingTime ], client )
58
- if len (m .clients [ nextPingTime ]) == 0 {
59
- delete (m .clients , nextPingTime )
53
+ delete (m .workers [ nexTime ], id )
54
+ if len (m .workers [ nexTime ]) == 0 {
55
+ delete (m .workers , nexTime )
60
56
}
61
- delete (m .clientPingMap , client )
57
+ delete (m .workersByIntervals , id )
62
58
}
63
59
}
64
60
65
- // Reset reschedules the ping for a specific client .
66
- func (m * PingManager ) Reset (client Client ) {
61
+ // Reset reschedules the worker for a specific id .
62
+ func (m * WorkerPool ) Reset (id int64 ) {
67
63
m .mutex .Lock ()
68
64
defer m .mutex .Unlock ()
69
65
70
- nextPingTime , ok := m .clientPingMap [ client ]
66
+ nextTime , ok := m .workersByIntervals [ id ]
71
67
if ok {
72
- pingInfo := m.clients [ nextPingTime ][ client ]
73
- delete (m .clients [ nextPingTime ], client )
74
- if len (m .clients [ nextPingTime ]) == 0 {
75
- delete (m .clients , nextPingTime )
68
+ wpCfg := m.workers [ nextTime ][ id ]
69
+ delete (m .workers [ nextTime ], id )
70
+ if len (m .workers [ nextTime ]) == 0 {
71
+ delete (m .workers , nextTime )
76
72
}
77
73
78
- newPingTime := time .Now ().Add (pingInfo .interval ).Unix ()
79
- if m .clients [ newPingTime ] == nil {
80
- m .clients [ newPingTime ] = make (map [Client ] pingConfig )
74
+ newTime := time .Now ().Add (wpCfg .interval ).Unix ()
75
+ if m .workers [ newTime ] == nil {
76
+ m .workers [ newTime ] = make (map [int64 ] wpConfig )
81
77
}
82
- m.clients [ newPingTime ][ client ] = pingInfo
83
- m .clientPingMap [ client ] = newPingTime
78
+ m.workers [ newTime ][ id ] = wpCfg
79
+ m .workersByIntervals [ id ] = newTime
84
80
}
85
81
}
86
82
87
- // Start begins the pinging process.
88
- func (m * PingManager ) Start () {
83
+ // Start begins the worker process.
84
+ func (m * WorkerPool ) Start () {
89
85
go func () {
90
86
for {
91
87
nowSeconds := time .Now ().Unix ()
92
88
93
89
m .mutex .Lock ()
94
- clients , ok := m .clients [nowSeconds ]
90
+ workers , ok := m .workers [nowSeconds ]
95
91
if ok {
96
- for client , pingCfg := range clients {
97
- err := client . Write ( pingCfg . dataFunc () )
92
+ for id , wpCfg := range workers {
93
+ err := wpCfg . callback ( )
98
94
if err != nil {
99
95
log .Printf ("error pinging client: %v" , err )
100
- m .Remove (client )
96
+ m .Remove (id )
101
97
continue
102
98
}
103
99
104
- // Reschedule the next ping for the client
105
- timeToPing := time .Now ().Add (pingCfg .interval ).Unix ()
106
- if m .clients [ timeToPing ] == nil {
107
- m .clients [ timeToPing ] = make (map [Client ] pingConfig )
100
+ // Reschedule the next worker
101
+ timeToWork := time .Now ().Add (wpCfg .interval ).Unix ()
102
+ if m .workers [ timeToWork ] == nil {
103
+ m .workers [ timeToWork ] = make (map [int64 ] wpConfig )
108
104
}
109
- m.clients [ timeToPing ][ client ] = pingCfg
110
- m .clientPingMap [ client ] = timeToPing
105
+ m.workers [ timeToWork ][ id ] = wpCfg
106
+ m .workersByIntervals [ id ] = timeToWork
111
107
112
108
}
113
- delete (m .clients , nowSeconds )
109
+ delete (m .workers , nowSeconds )
114
110
}
115
111
m .mutex .Unlock ()
116
112
0 commit comments