You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					35 lines
				
				884 B
			
		
		
			
		
	
	
					35 lines
				
				884 B
			| 
								 
											3 years ago
										 
									 | 
							
								import gc
							 | 
						||
| 
								 | 
							
								import greenlet
							 | 
						||
| 
								 | 
							
								import weakref
							 | 
						||
| 
								 | 
							
								import unittest
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class WeakRefTests(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    def test_dead_weakref(self):
							 | 
						||
| 
								 | 
							
								        def _dead_greenlet():
							 | 
						||
| 
								 | 
							
								            g = greenlet.greenlet(lambda: None)
							 | 
						||
| 
								 | 
							
								            g.switch()
							 | 
						||
| 
								 | 
							
								            return g
							 | 
						||
| 
								 | 
							
								        o = weakref.ref(_dead_greenlet())
							 | 
						||
| 
								 | 
							
								        gc.collect()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(o(), None)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_inactive_weakref(self):
							 | 
						||
| 
								 | 
							
								        o = weakref.ref(greenlet.greenlet())
							 | 
						||
| 
								 | 
							
								        gc.collect()
							 | 
						||
| 
								 | 
							
								        self.assertEqual(o(), None)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_dealloc_weakref(self):
							 | 
						||
| 
								 | 
							
								        seen = []
							 | 
						||
| 
								 | 
							
								        def worker():
							 | 
						||
| 
								 | 
							
								            try:
							 | 
						||
| 
								 | 
							
								                greenlet.getcurrent().parent.switch()
							 | 
						||
| 
								 | 
							
								            finally:
							 | 
						||
| 
								 | 
							
								                seen.append(g())
							 | 
						||
| 
								 | 
							
								        g = greenlet.greenlet(worker)
							 | 
						||
| 
								 | 
							
								        g.switch()
							 | 
						||
| 
								 | 
							
								        g2 = greenlet.greenlet(lambda: None, g)
							 | 
						||
| 
								 | 
							
								        g = weakref.ref(g2)
							 | 
						||
| 
								 | 
							
								        g2 = None
							 | 
						||
| 
								 | 
							
								        self.assertEqual(seen, [None])
							 |