Changeset 741 in code for trunk/conn.go


Ignore:
Timestamp:
Dec 2, 2021, 10:52:29 PM (4 years ago)
Author:
contact
Message:

Use golang.org/x/time/rate

Instead of hand-rolling our own rate-limiter based on goroutines,
use golang.org/x/time/rate.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/conn.go

    r703 r741  
    1111        "unicode"
    1212
     13        "golang.org/x/time/rate"
    1314        "gopkg.in/irc.v3"
    1415        "nhooyr.io/websocket"
     
    119120}
    120121
    121 type rateLimiter struct {
    122         C       <-chan struct{}
    123         ticker  *time.Ticker
    124         stopped chan struct{}
    125 }
    126 
    127 func newRateLimiter(delay time.Duration, burst int) *rateLimiter {
    128         ch := make(chan struct{}, burst)
    129         for i := 0; i < burst; i++ {
    130                 ch <- struct{}{}
    131         }
    132         ticker := time.NewTicker(delay)
    133         stopped := make(chan struct{})
    134         go func() {
    135                 for {
    136                         select {
    137                         case <-ticker.C:
    138                                 select {
    139                                 case ch <- struct{}{}:
    140                                         // This space is intentionally left blank
    141                                 case <-stopped:
    142                                         return
    143                                 }
    144                         case <-stopped:
    145                                 return
    146                         }
    147                 }
    148         }()
    149         return &rateLimiter{
    150                 C:       ch,
    151                 ticker:  ticker,
    152                 stopped: stopped,
    153         }
    154 }
    155 
    156 func (rl *rateLimiter) Stop() {
    157         rl.ticker.Stop()
    158         close(rl.stopped)
    159 }
    160 
    161122type connOptions struct {
    162123        Logger         Logger
     
    187148
    188149        go func() {
    189                 var rl *rateLimiter
    190                 if options.RateLimitDelay > 0 && options.RateLimitBurst > 0 {
    191                         rl = newRateLimiter(options.RateLimitDelay, options.RateLimitBurst)
    192                         defer rl.Stop()
    193                 }
    194 
     150                ctx, cancel := c.NewContext(context.Background())
     151                defer cancel()
     152
     153                rl := rate.NewLimiter(rate.Every(options.RateLimitDelay), options.RateLimitBurst)
    195154                for msg := range outgoing {
    196                         if rl != nil {
    197                                 <-rl.C
     155                        if err := rl.Wait(ctx); err != nil {
     156                                break
    198157                        }
    199158
Note: See TracChangeset for help on using the changeset viewer.