@@ -125,6 +125,18 @@ func TestPoll(t *testing.T) {
125125 assert .Equal (t , ErrTimeout , err )
126126}
127127
128+ func TestPollNoMemoryLeak (t * testing.T ) {
129+ q := New (0 )
130+
131+ assert .Len (t , q .waiters , 0 )
132+
133+ for i := 0 ; i < 10 ; i ++ {
134+ // Poll() should cleanup waiters after timeout
135+ q .Poll (1 , time .Nanosecond )
136+ assert .Len (t , q .waiters , 0 )
137+ }
138+ }
139+
128140func TestAddEmptyPut (t * testing.T ) {
129141 q := New (10 )
130142
@@ -419,6 +431,68 @@ func TestTakeUntilOnDisposedQueue(t *testing.T) {
419431 assert .IsType (t , ErrDisposed , err )
420432}
421433
434+ func TestWaiters (t * testing.T ) {
435+ s1 , s2 , s3 , s4 := newSema (), newSema (), newSema (), newSema ()
436+
437+ w := waiters {}
438+ assert .Len (t , w , 0 )
439+
440+ //
441+ // test put()
442+ w .put (s1 )
443+ assert .Equal (t , waiters {s1 }, w )
444+
445+ w .put (s2 )
446+ w .put (s3 )
447+ w .put (s4 )
448+ assert .Equal (t , waiters {s1 , s2 , s3 , s4 }, w )
449+
450+ //
451+ // test remove()
452+ //
453+ // remove from middle
454+ w .remove (s2 )
455+ assert .Equal (t , waiters {s1 , s3 , s4 }, w )
456+
457+ // remove non-existing element
458+ w .remove (s2 )
459+ assert .Equal (t , waiters {s1 , s3 , s4 }, w )
460+
461+ // remove from beginning
462+ w .remove (s1 )
463+ assert .Equal (t , waiters {s3 , s4 }, w )
464+
465+ // remove from end
466+ w .remove (s4 )
467+ assert .Equal (t , waiters {s3 }, w )
468+
469+ // remove last element
470+ w .remove (s3 )
471+ assert .Empty (t , w )
472+
473+ // remove non-existing element
474+ w .remove (s3 )
475+ assert .Empty (t , w )
476+
477+ //
478+ // test get()
479+ //
480+ // start with 3 elements in list
481+ w .put (s1 )
482+ w .put (s2 )
483+ w .put (s3 )
484+ assert .Equal (t , waiters {s1 , s2 , s3 }, w )
485+
486+ // get() returns each item in insertion order
487+ assert .Equal (t , s1 , w .get ())
488+ assert .Equal (t , s2 , w .get ())
489+ w .put (s4 ) // interleave a put(), item should go to the end
490+ assert .Equal (t , s3 , w .get ())
491+ assert .Equal (t , s4 , w .get ())
492+ assert .Empty (t , w )
493+ assert .Nil (t , w .get ())
494+ }
495+
422496func TestExecuteInParallel (t * testing.T ) {
423497 q := New (10 )
424498 for i := 0 ; i < 10 ; i ++ {
0 commit comments