1# mode: run 2 3from cpython.pythread cimport * 4 5 6cdef Py_tss_t *pass_py_tss_t_ptr(Py_tss_t *value): 7 return value 8 9 10def tss_create_delete(): 11 """ 12 >>> tss_create_delete() 13 (True, False) 14 """ 15 cdef Py_tss_t tss_key 16 cdef bint after_create, after_delete 17 if PyThread_tss_create(&tss_key) != 0: 18 raise MemoryError() 19 after_create = PyThread_tss_is_created(&tss_key) != 0 20 assert after_create == PyThread_tss_is_created(pass_py_tss_t_ptr(&tss_key)) 21 PyThread_tss_delete(&tss_key) 22 after_delete = PyThread_tss_is_created(&tss_key) != 0 23 return (after_create, after_delete) 24 25 26def tss_alloc_free(): 27 """ 28 >>> tss_alloc_free() 29 False 30 """ 31 cdef Py_tss_t *ptr_key 32 cdef bint after_alloc, after_free 33 ptr_key = PyThread_tss_alloc() 34 if ptr_key == NULL: 35 raise MemoryError() 36 after_alloc = PyThread_tss_is_created(ptr_key) != 0 37 PyThread_tss_free(ptr_key) 38 return after_alloc 39 40 41def tss_alloc_create_delete_free(): 42 """ 43 >>> tss_alloc_create_delete_free() 44 (False, True, False) 45 """ 46 cdef Py_tss_t *ptr_key 47 cdef bint after_alloc, after_free 48 ptr_key = PyThread_tss_alloc() 49 if ptr_key == NULL: 50 raise MemoryError() 51 after_alloc = PyThread_tss_is_created(ptr_key) != 0 52 if PyThread_tss_create(ptr_key) != 0: 53 raise MemoryError() 54 after_create = PyThread_tss_is_created(ptr_key) != 0 55 PyThread_tss_delete(ptr_key) 56 after_delete = PyThread_tss_is_created(ptr_key) != 0 57 PyThread_tss_free(ptr_key) 58 return (after_alloc, after_create, after_delete) 59 60 61def tss_set_get(): 62 """ 63 >>> tss_set_get() 64 1 65 """ 66 cdef Py_tss_t tss_key 67 cdef int the_value = 1 68 cdef int ret_value 69 if PyThread_tss_create(&tss_key) != 0: 70 raise MemoryError() 71 if PyThread_tss_get(&tss_key) == NULL: 72 PyThread_tss_set(&tss_key, <void *>&the_value) 73 ret_value = (<int *>PyThread_tss_get(&tss_key))[0] 74 PyThread_tss_delete(&tss_key) 75 return ret_value 76