-
Notifications
You must be signed in to change notification settings - Fork 1
/
c11_tss.c
64 lines (61 loc) · 1.48 KB
/
c11_tss.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*! \defgroup _tss_ C11 Thread-specific storage functions
\ingroup _system _libc
\brief Thread-specific storage functions
\{
*/
#include <threads.h>
#include <sys/thread.h>
#include "r3_slice.h"
typedef struct _thread osThread_t;
#define THREAD_PTR(x) ((osThread_t*)(x))
struct os_tss {
void* value;
tss_dtor_t dtor;
struct os_tss* next;
};
/*! \brief
\note Destructors associated with thread-specifc storage are not invoked at program termination
*/
int tss_create(tss_t *key, tss_dtor_t dtor)
{
tss_t tss = g_slice_new(struct os_tss);
tss->value= NULL;
tss->dtor = dtor;
thrd_t thr= thrd_current();
osThread_t* thrd = THREAD_PTR(thr);
tss->next = thrd->tss;
thrd->tss = tss;
*key = tss;
return thrd_success;
}
/*
\note Calling tss_delete will not result in the invocation of any destructors.
*/
void tss_delete(tss_t tss)
{
//void* val = tss->value;
tss->value = NULL;
tss->dtor = NULL;
//if (tss->dtor!= NULL && val!=NULL) tss->dtor(val);
}
void *tss_get(tss_t tss)
{
return (tss->value);
}
int tss_set(tss_t tss, void *val)
{
tss->value = val;
return thrd_success;
}
/* Это приватная функция вызывается при завершении треда */
static void tss_destroy(tss_t tss)
{
while(tss!=NULL) {
tss_t tss_next = tss->next;
if (tss->dtor!= NULL && tss->value!=NULL) tss->dtor(tss->value);
tss_delete(tss);
g_slice_free(tss_t, tss);
tss = tss_next;
}
}
//! \}