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