Commit graph

9 commits

Author SHA1 Message Date
Burcu Dogan
ae6b138363 Clarify chanotify docs about the usage of Add and Close
Signed-off-by: Burcu Dogan <jbd@google.com>
2016-02-18 20:42:39 -08:00
Burcu Dogan
e3a6c2b9ea Reject duplicate keys on the notifier.
Signed-off-by: Burcu Dogan <jbd@google.com>

mend
2016-02-17 12:32:51 -08:00
Burcu Dogan
10d291b825 chanotify: do not allow adding new channels if notifier is closed
Signed-off-by: Burcu Dogan <jbd@google.com>
2016-01-27 14:01:25 -08:00
Burcu Dogan
eed75373eb Take advantage of having interface{} chanotify keys
Signed-off-by: Burcu Dogan <jbd@google.com>
2016-01-22 11:35:15 -08:00
Burcu Dogan
bc4f1aae01 chanotify should use interface{} keys
Fixes #79.

Signed-off-by: Burcu Dogan <jbd@golang.org>
2016-01-22 08:15:13 -08:00
Burcu Dogan
85bc51df33 Rename the receiver name
Signed-off-by: Burcu Dogan <jbd@google.com>
2016-01-21 21:07:10 -08:00
Burcu Dogan
0cd5c21a50 Remove reflect from chanotify and fix a deadlock case.
With the change, the read rate from (*Notifier).Chan()
is 10-20 times faster and more consistent.

Consider the following program:

  s := chanotify.New()
  for i := 0; i < n; i++ {
    ch := make(chan struct{}, 1)
    s.Add(ch, fmt.Sprintf("%d", i))
    go func(ch chan struct{}) {
      time.Sleep(time.Second) // because your original code has a deadlock case.
      ch <- struct{}{}
    }(ch)
  }

  avgs := make([]int64, n)
  go func() {
    for i := 0; i < n; i++ {
      start := time.Now()
      <-s.Chan()
      avgs[i] = time.Now().Sub(start).Nanoseconds()
    }
  }()

  time.Sleep(10 * time.Second)
  s.Close()

  fmt.Println(avgs)

The output without the change; ignore the first value:

[1000469322 739 100492 200 75412 77733 316 88873 695 137905 244 72197 196 84444 175 80858 169 125514 165 73509 885 739963 248 72569 169 90094 159 110571 68954 143 145616 148 83563 149 86154 132 82722 154 79740 170 86688 143 97033 158 87126 187 69839 125 100043 148 72633 133 80690 149 41841 113509 346 134876 247 80720 153473 414352 293 103906 276 140524 233 88041 236 123732 242 89870 238 105342 213 110773 319 121004 228 89237 793 94458 235 604864 400129 412 82639 598 72319 178 64423 157 35779 44536 235 55411 129 46051 29032 231]

The output with the change; ignore the first value:

[999893266 3189 2514 2257 2119 2252 2780 3402 2689 2916 2218 2385 4459 495 309 1289 578 4432 590 421 387 335 1156 272 1566 4933 1271 537 391 792 373 329 411 527 1764 782 322 1044 718 533 405 1183 337 230 1827 848 575 692 321 3514 504 491 772 1952 575 2931 1754 1279 781 403 1137 451 953 914 369 387 289 1796 473 1237 798 816 1215 690 495 389 403 1235 373 364 515 509 321 349 319 41810 27359 2582 2055 2177 2486 2181 1903 2207 2207 2005 1746 1802 1864 2169]

The change also fixes the deadlock case pointed in the program above.

Signed-off-by: Burcu Dogan <jbd@google.com>
2016-01-20 15:34:25 -08:00
Alexander Morozov
e2f3518af8 Fix adding to chanotify on blocking select
Signed-off-by: Alexander Morozov <lk4d4@docker.com>
2015-12-22 08:28:37 -08:00
Alexander Morozov
fed10a2c22 Add chanotify package
It allows to listen for notifications on bunch of channels.

Signed-off-by: Alexander Morozov <lk4d4@docker.com>
2015-12-18 11:46:45 -08:00