diff --git a/ringbuffer.py b/ringbuffer.py index 6003755..729057a 100644 --- a/ringbuffer.py +++ b/ringbuffer.py @@ -255,6 +255,15 @@ def force_reader_sync(self): for reader in self.readers: p = reader.get() + def force_single_reader_sync(self, reader): + """Forces passed reader to skip to the position of the writer.""" + with self.lock.for_write(): + writer_position = self.writer.get() + + reader.set(writer_position.counter) + + p = reader.get() + def writer_done(self): """Called by the writer when no more data is expected to be written. diff --git a/test_ringbuffer.py b/test_ringbuffer.py index b832712..ce8e1f6 100755 --- a/test_ringbuffer.py +++ b/test_ringbuffer.py @@ -382,6 +382,9 @@ def expect_already_closed(self): def force_reader_sync(self): self.ring.force_reader_sync() + def force_single_reader_sync(self, reader): + self.ring.force_single_reader_sync(reader) + def expect_try_read_type(self, type_or_class): data = self.ring.try_read(self.pointer) self.testcase.assertTrue(isinstance(data, type_or_class)) @@ -785,6 +788,28 @@ def test_force_reader_sync(self): r1.expect_index(3) r2.expect_index(3) + """ This doesn't work :'( + def test_force_single_reader_sync(self): + writer = self.new_writer() + r1 = self.new_reader() + r2 = self.new_reader() + self.start_proxies() + + writer.write(b'one') + writer.write(b'two') + writer.write(b'three') + + writer.expect_index(3) + r1.expect_index(0) + r2.expect_index(0) + + writer.force_single_reader_sync(r1) + r1.expect_index(3) + r2.expect_index(0) + writer.force_single_reader_sync(r2) + r2.expect_index(3) + """ + def _do_multiple_writers(self, blocking): w1 = self.new_writer() w2 = self.new_writer()