def test_cvar_notify(): # Just tests that notifying without waiting does no harm. m = Mutex() cv = ConditionVarFull(m) cv.notify() cv.notify_all() del cv
def test_cvar_notify_locked(): # Tests the same thing, but with the lock held. m = Mutex() cv = ConditionVarFull(m) with m: cv.notify() with m: cv.notify_all() del cv
def test_cvar_notify_thread(num_threads): # Tests notify() with some number of threads waiting. m = Mutex() cv = ConditionVarFull(m) # We prematurely notify, so that we can test that it's not doing anything. m.acquire() cv.notify() state = {'waiting': 0} def wait_thread(): m.acquire() state['waiting'] += 1 cv.wait() state['waiting'] -= 1 m.release() # Start the threads, and yield to it, giving it a chance to mess up. threads = [] for i in range(num_threads): thread = core.PythonThread(wait_thread, (), "", "") thread.start(core.TP_high, True) # Yield until all of the threads are waiting for the condition variable. for i in range(1000): m.release() yield_thread() m.acquire() if state['waiting'] == num_threads: break assert state['waiting'] == num_threads # OK, now signal it, and yield. One thread must be unblocked per notify. for i in range(num_threads): cv.notify() expected_waiters = num_threads - i - 1 for j in range(1000): m.release() yield_thread() m.acquire() if state['waiting'] == expected_waiters: break assert state['waiting'] == expected_waiters m.release() for thread in threads: thread.join() cv = None
def test_cvar_notify_locked(): # Tests the same thing, but with the lock held. m = Mutex() cv = ConditionVarFull(m) m.acquire() cv.notify() m.release() m.acquire() cv.notify_all() m.release() del cv