示例#1
0
 def test_acquire_release(self):
     lock = toro.RWLock(max_readers=10)
     self.assertFalse(lock.locked())
     yield lock.acquire_write()
     self.assertTrue(lock.locked())
     lock.release_write()
     self.assertFalse(lock.locked())
示例#2
0
    def test_reacquire_concurrent(self):
        MAX_READERS = 10

        # Lock needs to be released before re-acquiring.
        lock = toro.RWLock(max_readers=MAX_READERS)
        phase = []

        @gen.coroutine
        def f():
            for _ in range(MAX_READERS):
                yield lock.acquire_read()

            self.assertTrue(lock.locked())
            phase.append(None)

            # concurrent acquire_write
            yield [lock.acquire_write(), lock.acquire_write()]
            self.assertTrue(lock.locked())
            phase.append(None)

        future = f()

        while len(phase) == 0:
            yield gen.Task(self.io_loop.add_callback)

        self.assertEqual(len(phase), 1)
        for i in range(MAX_READERS):
            lock.release_read()

        lock.release_write()

        yield future
        self.assertEqual(len(phase), 2)
示例#3
0
    def test_reacquire(self):
        MAX_READERS = randint(2, 10)

        # Lock needs to be released before re-acquiring.
        lock = toro.RWLock(max_readers=MAX_READERS)
        phase = []

        @gen.coroutine
        def f():
            yield lock.acquire_read()
            self.assertFalse(lock.locked())
            phase.append(None)

            yield lock.acquire_write()
            self.assertTrue(lock.locked())
            phase.append(None)

        future = f()

        while len(phase) == 0:
            yield gen.Task(self.io_loop.add_callback)

        self.assertEqual(len(phase), 1)
        lock.release_read()
        yield future
        self.assertEqual(len(phase), 2)
示例#4
0
 def test_acquire_release(self):
     lock = toro.RWLock(max_readers=1)
     self.assertFalse(lock.locked())
     self.assertTrue(lock.acquire_read().done())
     self.assertTrue(lock.locked())
     lock.release_read()
     self.assertFalse(lock.locked())
示例#5
0
    def test_write_context_managers(self):
        MAX_READERS = randint(2, 10)
        lock = toro.RWLock(max_readers=MAX_READERS)

        self.assertFalse(lock.locked())
        with (yield lock.acquire_write()):
            self.assertTrue(lock.locked())
        self.assertFalse(lock.locked())
示例#6
0
    def test_read_lock(self):
        MAX_READERS = randint(2, 10)
        lock = toro.RWLock(max_readers=MAX_READERS)
        for i in range(MAX_READERS):
            self.assertFalse(lock.locked())
            yield lock.acquire_read()

        self.assertTrue(lock.locked())
示例#7
0
 def test_acquire_callback(self):
     lock = toro.RWLock(max_readers=1)
     history = []
     lock.acquire_read().add_done_callback(make_callback('acq1', history))
     lock.acquire_read().add_done_callback(make_callback('acq2', history))
     lock.release_read()
     history.append('release')
     self.assertEqual(['acq1', 'acq2', 'release'], history)
示例#8
0
 def test_acquire_callback(self):
     lock = toro.RWLock(max_readers=10)
     history = []
     lock.acquire_write().add_done_callback(make_callback('acq1', history))
     future = lock.acquire_write()
     future.add_done_callback(make_callback('acq2', history))
     lock.release_write()
     yield future
     history.append('release')
     self.assertEqual(['acq1', 'acq2', 'release'], history)
示例#9
0
    def test_read_context_managers(self):
        MAX_READERS = 2
        lock = toro.RWLock(max_readers=MAX_READERS)

        self.assertFalse(lock.locked())
        with (yield lock.acquire_read()):
            self.assertFalse(lock.locked())
            with (yield lock.acquire_read()):
                self.assertTrue(lock.locked())
            self.assertFalse(lock.locked())
        self.assertFalse(lock.locked())
示例#10
0
    def test_partial_release(self):
        lock = toro.RWLock(max_readers=5)
        N = 5

        for i in range(N):
            yield lock.acquire_read()

        for i in range(N):
            lock.release_read()

        yield lock.acquire_write()
        lock.release_write()
示例#11
0
    def test_release_unlocked(self):
        lock = toro.RWLock(max_readers=5)
        N = 5

        for i in range(N):
            yield lock.acquire_read()

        for i in range(N):
            lock.release_read()

        with assert_raises(RuntimeError):
            lock.release_read()
示例#12
0
    def test_acquire_timeout(self):
        lock = toro.RWLock(max_readers=10)
        yield lock.acquire_write()
        self.assertTrue(lock.locked())
        st = time.time()

        with assert_raises(toro.Timeout):
            yield lock.acquire_write(deadline=timedelta(seconds=0.1))

        duration = time.time() - st
        self.assertAlmostEqual(0.1, duration, places=1)
        self.assertTrue(lock.locked())
示例#13
0
    def test_acquire_contended(self):
        lock = toro.RWLock(max_readers=1)
        self.assertTrue(lock.acquire_read().done())
        N = 5

        @gen.coroutine
        def f():
            yield lock.acquire_read()
            lock.release_read()

        futures = [f() for _ in range(N)]
        lock.release_read()
        yield futures
示例#14
0
    def test_acquire_contended(self):
        lock = toro.RWLock(max_readers=10)
        yield lock.acquire_write()
        N = 5

        @gen.coroutine
        def f():
            yield lock.acquire_write()
            lock.release_write()

        futures = [f() for _ in range(N)]
        lock.release_write()
        yield futures
示例#15
0
    def test_release_unlocked(self):
        lock = toro.RWLock(max_readers=1)

        with assert_raises(RuntimeError):
            lock.release_read()
示例#16
0
 def test_write_lock(self):
     MAX_READERS = randint(2, 10)
     lock = toro.RWLock(max_readers=MAX_READERS)
     self.assertFalse(lock.locked())
     yield lock.acquire_write()
     self.assertTrue(lock.locked())
示例#17
0
 def test_multi_release(self):
     lock = toro.RWLock(max_readers=10)
     lock.acquire_write()
     lock.release_write()
     self.assertRaises(RuntimeError, lock.release_write)
示例#18
0
 def test_str(self):
     lock = toro.RWLock(max_readers=10)
     # No errors in various states.
     str(lock)
     lock.acquire_write()
     str(lock)