v / vlib / sync / tls.v
111 lines · 105 sloc · 2.44 KB · fcbe2e6ce77207e4d35b31cade9d6f1ecef55b5f
Raw
1module sync
2
3// ThreadLocalStorage provides thread-local storage for values of type T
4@[noinit]
5struct ThreadLocalStorage[T] {
6mut:
7 key u64 // TLS key identifier. Note: While Linux uses unsigned int, Darwin requires unsigned long. u64 accommodates both.
8 in_use bool // Allocation status flag
9}
10
11// DataConversion convert voidptr to/from type T
12union DataConversion {
13mut:
14 f_u8 u8
15 f_u16 u16
16 f_u32 u32
17 f_u64 u64
18
19 f_i8 i8
20 f_i16 i16
21 f_i32 i32
22 f_i64 i64
23
24 f_voidptr voidptr
25 f_isize isize
26 f_usize usize
27 f_int int
28 f_f32 f32
29 f_f64 f64
30 f_rune rune
31}
32
33// convert_t_to_voidptr convert value from type T to voidptr
34@[inline]
35fn convert_t_to_voidptr[T](value T) !voidptr {
36 mut f := DataConversion{}
37 $if T is i8 {
38 f.f_i8 = value
39 } $else $if T is i16 {
40 f.f_i16 = value
41 } $else $if T is i32 {
42 f.f_i32 = value
43 } $else $if T is i64 {
44 f.f_i64 = value
45 } $else $if T is u8 {
46 f.f_u8 = value
47 } $else $if T is u16 {
48 f.f_u16 = value
49 } $else $if T is u32 {
50 f.f_u32 = value
51 } $else $if T is u64 {
52 f.f_u64 = value
53 } $else $if T is $pointer {
54 f.f_voidptr = voidptr(value)
55 } $else $if T is isize {
56 f.f_isize = value
57 } $else $if T is usize {
58 f.f_usize = value
59 } $else $if T is int {
60 f.f_int = value
61 } $else $if T is f32 {
62 f.f_f32 = value
63 } $else $if T is f64 {
64 f.f_f64 = value
65 } $else $if T is rune {
66 f.f_rune = value
67 } $else {
68 return error('Unsupported data type `${T.name}` to voidptr')
69 }
70 return unsafe { f.f_voidptr }
71}
72
73// convert_voidptr_to_t convert value from voidptr to type T
74@[inline]
75fn convert_voidptr_to_t[T](value voidptr) !T {
76 f := DataConversion{
77 f_voidptr: value
78 }
79 $if T is i8 {
80 return unsafe { f.f_i8 }
81 } $else $if T is i16 {
82 return unsafe { f.f_i16 }
83 } $else $if T is i32 {
84 return unsafe { f.f_i32 }
85 } $else $if T is i64 {
86 return unsafe { f.f_i64 }
87 } $else $if T is u8 {
88 return unsafe { f.f_u8 }
89 } $else $if T is u16 {
90 return unsafe { f.f_u16 }
91 } $else $if T is u32 {
92 return unsafe { f.f_u32 }
93 } $else $if T is u64 {
94 return unsafe { f.f_u64 }
95 } $else $if T is $pointer {
96 return unsafe { f.f_voidptr }
97 } $else $if T is isize {
98 return unsafe { f.f_isize }
99 } $else $if T is usize {
100 return unsafe { f.f_usize }
101 } $else $if T is int {
102 return unsafe { f.f_int }
103 } $else $if T is f32 {
104 return unsafe { f.f_f32 }
105 } $else $if T is f64 {
106 return unsafe { f.f_f64 }
107 } $else $if T is rune {
108 return unsafe { f.f_rune }
109 }
110 return error('Unsupported data type `${T.name}` from voidptr')
111}
112