v/vlib/sync/tls.v

112 lines
2.4 KiB
V

module sync
// ThreadLocalStorage provides thread-local storage for values of type T
@[noinit]
struct ThreadLocalStorage[T] {
mut:
key u64 // TLS key identifier. Note: While Linux uses unsigned int, Darwin requires unsigned long. u64 accommodates both.
in_use bool // Allocation status flag
}
// DataConversion convert voidptr to/from type T
union DataConversion {
mut:
f_u8 u8
f_u16 u16
f_u32 u32
f_u64 u64
f_i8 i8
f_i16 i16
f_i32 i32
f_i64 i64
f_voidptr voidptr
f_isize isize
f_usize usize
f_int int
f_f32 f32
f_f64 f64
f_rune rune
}
// convert_t_to_voidptr convert value from type T to voidptr
@[inline]
fn convert_t_to_voidptr[T](value T) !voidptr {
mut f := DataConversion{}
$if T is i8 {
f.f_i8 = value
} $else $if T is i16 {
f.f_i16 = value
} $else $if T is i32 {
f.f_i32 = value
} $else $if T is i64 {
f.f_i64 = value
} $else $if T is u8 {
f.f_u8 = value
} $else $if T is u16 {
f.f_u16 = value
} $else $if T is u32 {
f.f_u32 = value
} $else $if T is u64 {
f.f_u64 = value
} $else $if T is $pointer {
f.f_voidptr = voidptr(value)
} $else $if T is isize {
f.f_isize = value
} $else $if T is usize {
f.f_usize = value
} $else $if T is int {
f.f_int = value
} $else $if T is f32 {
f.f_f32 = value
} $else $if T is f64 {
f.f_f64 = value
} $else $if T is rune {
f.f_rune = value
} $else {
return error('Unsupported data type `${T.name}` to voidptr')
}
return unsafe { f.f_voidptr }
}
// convert_voidptr_to_t convert value from voidptr to type T
@[inline]
fn convert_voidptr_to_t[T](value voidptr) !T {
f := DataConversion{
f_voidptr: value
}
$if T is i8 {
return unsafe { f.f_i8 }
} $else $if T is i16 {
return unsafe { f.f_i16 }
} $else $if T is i32 {
return unsafe { f.f_i32 }
} $else $if T is i64 {
return unsafe { f.f_i64 }
} $else $if T is u8 {
return unsafe { f.f_u8 }
} $else $if T is u16 {
return unsafe { f.f_u16 }
} $else $if T is u32 {
return unsafe { f.f_u32 }
} $else $if T is u64 {
return unsafe { f.f_u64 }
} $else $if T is $pointer {
return unsafe { f.f_voidptr }
} $else $if T is isize {
return unsafe { f.f_isize }
} $else $if T is usize {
return unsafe { f.f_usize }
} $else $if T is int {
return unsafe { f.f_int }
} $else $if T is f32 {
return unsafe { f.f_f32 }
} $else $if T is f64 {
return unsafe { f.f_f64 }
} $else $if T is rune {
return unsafe { f.f_rune }
}
return error('Unsupported data type `${T.name}` from voidptr')
}